#include<stdio.h>#include<stdlib.h>#define LEN sizeof(struct student)struct
student{ int
num; double
score; struct
student *next;};//创建一个链表struct
student * create(void){ struct
student *p1,*p2,*head; int
n = 0; p1 = p2 = (struct
student *)malloc(LEN); scanf("%d%lf",&(p1->num),&(p1->score)); while(p1->num!=0){ n++; if(n==1){ head = p1; }else{ p2 = p1; } p1 = (struct
student *)malloc(LEN); scanf("%d%lf",&(p1->num),&(p1->score)); p2->next = p1; } p2->next = NULL; return
head;}struct
student *delw(struct
student *start,int
num){ struct
student *p1,*p2; //链表为空 if(start==NULL){ printf("\nlist null!\n"); return
NULL; } p1 = start; p2 = NULL; //链表不为空 //链表只有一个元素,且即为所要找的元素 /*if(p1->next==NULL&&p1->num == num){ printf("there is only one element and that is it!"); return NULL; }*/ while(p1->next!=NULL&&p1->num!=num){ p2 = p1; p1 = p1->next; } if(num == p1->num){ if(p1 == start){ return
start->next; }else{ p2->next = p1->next; } }else{ printf("number not found!"); } return
start;}struct
student *del(struct
student *head,long
num){ struct
student *p1, *p2; //链表为空 if(head == NULL){ printf("\nlist null!\n"); return
head; } //链表不为空 p1 = head; while(p1->next!=NULL&&num!=p1->num){ p2 = p1; p1 = p1->next; } if(num == p1->num){ if(p1 == head){ head = p1->next; }else{ p2->next = p1->next; printf("delete:%ld\n",num); } }else printf("%ld not been found!\n",num); return
head;}//删除一个节点struct
student * deleteNode(struct
student *start,int
num){ struct
student *p1, *p2,*before,*after; //空表 if(start==NULL){ printf("the linktable is null"); return
NULL; } p1 = p2 = start; //只有一个节点 if(start->next==NULL){ if(start->num==num){ return
NULL; } } //链表不为空(两个以上的节点) //1:链表的第一个即为所要找的 if((start->num == num)&&(start->next!=NULL)){ return
start->next; } while(p1!=NULL){ if(p1->num==num){ before = p2; after = p1->next; } p2 = p1; p1 = p1->next; } before->next = after; return
start;}struct
student * insert(struct
student *head,struct
student *stu){ struct
student *p1,*p2, *p0; p1 = head; p0 = stu; //链表为空 if(head == NULL){ head = p0; p0->next = NULL; printf("the link is null\n"); return
NULL; //链表不为空,比较num,(如22, 33, 55),44应插入至33后面 }else{ //一个元素 //printf("head.next is not null"); //两个以上元素: 22 55 88 while(p1->num<p0->num&&p1->next!=NULL){ p2 = p1; p1 = p1->next; } if(p1->num>p0->num){// if(p1==head){//p0排到最前 head = p0; p0->next = p1; }else{ //p0排到中间 p2->next = p0; p0->next = p1; } }else{//p0排到最后 p1->next = p0; p0->next = NULL; } return
head; } }void
printLink(struct
student *p){ struct
student *p_afterDeal = p; p_afterDeal = p; while(p_afterDeal!=NULL){ printf("num = %d, score = %lf\n",p_afterDeal->num,p_afterDeal->score); p_afterDeal = p_afterDeal->next;
}}int
main(void){ struct
student * p_std, * p_afterDel,*p,*p_afterInsert; struct
student newstd = {44,44.4,NULL}; //创建一个链表 printf("创建一个链表:\n"); p_std = create(); printf("创建的链表如下:\n"); printLink(p_std); //插入一个节点 printf("插入一个节点:44\n"); p = &newstd; p_afterInsert = insert(p_std,p); printf("插入一个节点后的列表如下:\n"); printLink(p_afterInsert); //删除一个节点 printf("删除一个节点:44\n"); p_afterDel = deleteNode(p_afterInsert,44); printf("删除一个节点后的列表如下:\n"); printLink(p_afterDel); system("pause");} |
链表的增删改查的操作
最新推荐文章于 2021-06-03 12:06:44 发布
1416

被折叠的 条评论
为什么被折叠?



