链表
双链表
#include<stdio.h>
#include<stdlib.h>
typedef struct Dlink{
int elem;
struct Dlink *ahead;
struct Dlink *next;
} dlink;
dlink *initDlink(){
dlink *p = (dlink*)malloc(sizeof(dlink));
dlink *temp = p;
p->ahead = NULL;
p->next = NULL;
for(int i=1;i<5;i++){
dlink *node = (dlink*)malloc(sizeof(dlink));
node->elem = i;
node->next = NULL;
node->ahead = temp;
temp->next = node;
temp = temp->next;
}
return p;
}
dlink *insertNode(dlink *p,int address,int elem){
dlink *temp = p;
if(address <= 0){
printf("插入位置无效!!\n");
return p;
}
for(int i=1;i<address;i++){
temp = temp->next;
if(temp == NULL){
printf("插入位置无效!!\n");
return p;
}
}
dlink *node = (dlink*)malloc(sizeof(dlink));
node->ahead = temp;
node->next = temp->next;
node->elem = elem;
if(temp->next){
temp->next->ahead = node;
temp->next = node;
return p;
}
temp->next= node;
return p;
}
dlink *delNode(dlink *p,int address){
dlink *temp = p;
for(int i=1;i<address;i++){
temp = temp->next;
if(temp == NULL){
printf("删除位置无效!!\n");
return p;
}
}
dlink *dels = temp->next;
temp->next = dels->next;
dels->next->ahead = temp;
free(dels);
return p;
}
void show(dlink *p){
dlink *temp = p;
temp = temp->next;
while(temp){
printf("%5d",temp->elem);
temp = temp->next;
}
printf("\n");
}
int main(){
dlink *p = initDlink();
printf("初始化双链表为:\n");
show(p);
dlink *insert = insertNode(p,5,8);
printf("插入节点后的双链表为:\n");
show(insert);
dlink *dele = delNode(p,2);
printf("删除节点后的双链表为:\n");
show(dele);
return 0;
}
单链表
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct Link{
int elem;
struct Link *next;
}link;
//初始化链表函数
link *initLink(int num){
srand((unsigned int)time(NULL)); //初始化种子为随机值
link *p = (link*)malloc(sizeof(link));
link *temp = p;
for(int i=1;i<num;i++){
link *node = (link*)malloc(sizeof(link));
int data = rand() % 10 + 1; //随机生成 1-10 的数据
node->elem = data;
node->next = NULL;
temp->next = node;
temp = temp->next;
}
return p;
}
//插入节点函数
link *insertNode(link *p,int add,int elem){
link *temp = p;
if(add <= 0){
printf("插入位置无效! \n");
return p;
}
for(int i=1;i<add;i++){
temp = temp->next;
if(temp == NULL){
printf("插入位置无效!\n");
return p;
}
}
link *node = (link*)malloc(sizeof(link));
node->next = temp->next;
temp->next = node;
node->elem = elem;
return p;
}
//删除节点函数
link *delNode(link *p,int del){
link *temp = p;
if(del <= 0){
printf("删除失败,没有此节点!\n");
return p;
}
for(int i=1;i<del ; i++){
temp = temp->next;
if(temp->next == NULL){
printf("删除失败,没有此节点!\n");
return p;
}
}
link *delete = temp->next;
temp->next= temp->next->next;
free(delete);
return p;
}
//更新元素函数
link *updatElem(link *p,int add,int newelem){
link *temp = p;
if(add <= 0){
printf("更新失败,没有此节点!\n");
return p;
}
for(int i=1; i<add ;i++){
temp = temp->next;
if(temp == NULL){
printf("更新失败,没有此节点!\n");
return p;
}
}
temp = temp->next;
temp->elem = newelem;
return p;
}
//查找元素函数
int findElem(link *p,int elem){
link *temp = p;
temp = temp->next;
int i=1;
while(temp->next){
if(temp->elem == elem){
return i;
}
i++;
temp = temp->next;
}
return 0;
}
//输出链表函数
void display(link *p){
link *temp = p;
while(temp->next){
temp = temp->next;
printf("%5d",temp->elem);
}
printf("\n");
}
int main(){
int num = 10;
link *p = initLink(num); //初始化链表
printf("初始化链表为:\n");
display(p);
link *insert = insertNode(p,10,8); //插入节点
printf("插入节点后的链表为:\n");
display(insert);
link *dele = delNode(insert,6); //删除节点
printf("删除节点后的链表为:\n");
display(dele);
link *update = updatElem(dele,2,10); //更新节点元素
printf("更新后节点后的链表为:\n");
display(update);
int find = findElem(update,100); //查找元素
if(find){
printf("查找成功,该元素在第 %d 个节点上\n",find);
}else{
printf("查找失败,没有该元素信息\n");
}
}
顺序表
#include<stdio.h>
#include<stdlib.h>
#define max_size 4
typedef int datatype;
typedef struct xxb{
datatype *a;
int length;
}xxb;
//初始化,分配空间函数
void init(xxb *L){
L->a = (datatype *)malloc(sizeof(datatype) * max_size);
L->length = 0;
}
//赋初值函数
void init_data(xxb *L,int i){
L->a[i] = i+1;
L->length++;
}
//插入函数
int insert_data(xxb *L,int i,datatype x){
//判断是否可插入
if(i<1 || i>L->length){
printf("insert data fialed!!\n");
return 0;
}
for(int j=L->length-1;j>=i-1;j--) //插入数据,移动数据
L->a[j+1] = L->a[j];
L->a[i-1]=x;
L->length++;
return 1;
}
//查找函数
int find_data(xxb *L, int i,datatype *x){
//判断数据是否存在
if(i<1 || i>L->length){
printf("find data fialed!!\n");
return 0;
}
*x = L->a[i-1];
return 1;
}
//删除函数
int del_data(xxb *L,int i,datatype *x){
//判断数据是否存在
if(i<1 || i>L->length){
printf("delete data fialed!!\n");
return 0;
}
*x = L->a[i-1];
for(int j=i;j<L->length;j++)
L->a[j-1] = L->a[j];
L->length--;
return 1;
}
int main(){
xxb L;
int i;
datatype x;
init(&L); //初始化,分配空间
for(i=0;i<max_size;i++)
init_data(&L,i); //赋初值
if(insert_data(&L,2,8)){
printf("insert scceuss!!!\n"); //插入数据成功输出
}
if(find_data(&L,2,&x)){
printf("you find data is %d\n",x); //查找数据并输出
}
if(del_data(&L,2,&x)){
printf("you delete data is %d\n",x); //删除数据并输出
}
for(i=0;i<L.length;i++)
printf("%5d\n",L.a[i]); //查看所有数据
return 0;
}
单链表–数据结构版
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//单链表
typedef struct Link{
int data;
struct Link *next;
} link ;
//初始化链表头结点,生成一个头结点
void initLink(link **head){
*head = (link*)malloc(sizeof(link));
(*head)->next = NULL;
}
//插入函数
int insertNode(link *p,int data,int address){
link *temp = p;
int i = 0;
while((i<address-1) && (temp->next)){
temp = temp->next;
i++;
}
if(i == address-1){
link *node = (link*)malloc(sizeof(link));
node->next = temp->next;
temp->next = node;
node->data = data;
return 1;
}
return 0;
}
//删除函数
int delNode(link *p,int address){
link *temp = p;
int i = 0;
if(address <= 0) return 0;
while((i<address-1) && (temp->next)){
temp = temp->next;
i++;
}
if(temp->next){
link *frees = temp->next;
temp->next = temp->next->next;
free(frees);
return 1;
}
return 0;
}
//节点,元素随机生成函数
int randNode(link *p,int num){
link *temp = p;
srand((unsigned int)time(NULL));
for(int i=0;i<num;i++){
link *node = (link*)malloc(sizeof(link));
node->next = temp->next;
node->data = rand()%100 + 1;
temp->next = node;
temp = temp->next;
}
return 1;
}
//更新元素函数
int update(link *p,int data,int address){
link *temp = p;
int i = 0;
if(address <= 0) return 0;
while(i<address-1 && temp->next){
temp = temp->next;
i++;
}
if(temp->next){
temp = temp->next;
temp->data = data;
return 1;
}
return 0;
}
//查找函数
int find(link *p,int data){
link *temp = p;
int i = 1;
while(temp->next){
temp = temp->next;
if(temp->data == data){
return i;
}
i++;
}
return 0;
}
//输出整个链表元素函数
void display(link *p){
link *temp = p;
while(temp->next){
temp = temp->next;
printf("%5d",temp->data);
}
printf("\n");
}
int main(){
link *head;
link *news;
initLink(&news);
initLink(&head);
if(insertNode(head,8,1)){
printf("插入成功!\n");
}else{
printf("位置无效\n");
}
if(randNode(news,10)){
printf("随机生成!\n");
}
display(news);
if(delNode(news,1)){
printf("删除成功!\n");
display(news);
}else{
printf("删除失败!\n");
}
if(update(news,1000,9)){
printf("更新成功!\n");
display(news);
}else{
printf("更新失败!\n");
}
int i = find(news,1000);
if(i){
printf("查找成功,在第%d 个节点\n",i);
}else{
printf("查找失败\n");
}
}
顺序栈,进制转换
#include<stdio.h>
#include<stdlib.h>
#define max_size 10
//抽象数据类型
typedef struct stack{
int *a;
int top;
} stack;
//判空
int Empty(stack *L){
return (L->top == -1);
}
//判满
int Full(stack *L){
return (L->top == max_size);
}
//初始化栈
void initStack(stack *L){
L->a = (int *)malloc(sizeof(int) * max_size);
L->top = -1;
}
//入栈
int push(stack *L,int elem){
L->a[(++L->top)] = elem;
}
//出栈/输出
int pop(stack *L){
int length = L->top+1;
if(Empty(L)){
printf("Error\n");
return 1;
}
for(int i=0;i<length;i++){
printf("%5d",L->a[(L->top--)]);
}
printf("\n");
return 0;
}
//十六进制进制输出
int pop_change(stack *S){
int length = S->top+1;
int j = 0;
if(Empty(S)){
printf("Error\n");
return 1;
}
for(int i=0;i<length;i++){
if(S->a[S->top] == 10) printf("A");
else if(S->a[S->top] == 11) printf("B");
else if(S->a[S->top] == 12) printf("C");
else if(S->a[S->top] == 13) printf("D");
else if(S->a[S->top] == 14) printf("E");
else if(S->a[S->top] == 15) printf("F");
else printf("%d",S->a[S->top]);
S->top--;
}
printf("\n");
return 0;
}
//进制转换
int change(int n,int m){
stack S;
initStack(&S);
while(n != 0){
push(&S,n%m);
n = n/m;
}
if(m<9) pop(&S);
else pop_change(&S);
return 0;
}
int main(){
stack L;
initStack(&L);
if(Full(&L)) return 0;
if(Empty(&L)){
for(int i = 0;i<max_size; i++){
push(&L,i);
}
}
pop(&L);
change(3456,16);
}
/*
int change(stack *S,int n,int m){
while(n != 0){
S->a[(++S->top)] = n%m;
n = n/m;
}
return 0;
}
*/