--->关于链表的增删改查的基本操作

    xiaoxiao2021-03-25  128

    //建立一个学生成绩的线性链表,然后对其进行插入,删除,显示,最后销毁该链表 #include<stdio.h> #include<stdlib.h> //定义节点的数据类型 struct Grade_Info { int score; struct Grade_Info *next; }; typedef struct Grade_Info NODE; //定义数据结构的类型的别名为NODE //声明函数 NODE *Create_LinkList(); //创建链表 void Insert_LinkList(NODE *head,NODE *pnew, int i); //插入数据 void Delete_LinkList(NODE *head,int i); //删除节点 void Display_LinkList(NODE *head); void Free_LinkList(NODE *head); void main() { NODE *head, *pnew; head = Create_LinkList(); //创建链表 if(head==NULL) { printf("no enough memory!\n"); return; } printf("after create:"); Display_LinkList(head); //输出链表中的值 pnew = (NODE *)malloc(sizeof(NODE)); //新建一插入的节点 if(pnew==NULL) { printf("no enough memory!\n"); return; } pnew->score = 88; Insert_LinkList(head,pnew,3); //将新节点插入节点3的后面 printf("after insert:\n"); Display_LinkList(head); //输出链表中的值 Delete_LinkList(head,3); //删除节点中的3的值 printf("after delete:\n"); Display_LinkList(head); Free_LinkList(head); //销毁链表 } //创建链表 NODE *Create_LinkList() { NODE *head,*tail, *pnew; int score; head = (NODE *)malloc(sizeof(NODE)); //创建头结点 if(head==NULL) { printf("no enough memory!\n"); return 0; } head->next = NULL; tail = head; printf("input the score of students:\n"); while(1) { scanf("%d",&score); if(score < 0) break; pnew = (NODE *)malloc(sizeof(NODE)); //创建一新节点 if(pnew==NULL) { printf("no enough memory!\n"); return 0; } pnew->score = score; //把数据放入节点中 pnew->next = NULL; tail->next = pnew; //关键步骤 tail = pnew; } return(head);} //增加节点: 在第 I 个节点后 插入一个新节点 (头结点算第0个节点) void Insert_LinkList(NODE *head, NODE *pnew, int i) { NODE *p; int j; p = head; //为什么要写这一步,不能用head直接操作吗,直接操作会改变head的指向吗? for(j = 0;p != NULL&&j<i; j++) //将P指向要插入的 第 i 个节点 p = p->next; if(p == NULL) //表明第i个节点不存在 { printf("the %d node not found !\n", i); return; } pnew->next = p->next; p->next = pnew; } //删除节点的值 void Delete_LinkList(NODE *head, int i) { NODE *p,*q; int j; if(i==0) //删除的是头指针,则返回a return; p = head; for(j=1;j<i&&p->next!=NULL;j++) //找出第i个节点的 前驱节点,并且要保证后第i个节点存在 p=p->next; if(p->next==NULL) //表明第i个节点不存在 { printf("the %d node not foundt!\n",i); return; } q = p->next; p->next = q->next; free(q); //释放节点 i 的内存单元 } //链表的输出操作 void Display_LinkList(NODE *head) { NODE *p; int j; //方法一: p = head; for(j=1;p->next!=NULL;j++) { p=p->next; printf("NODE[j]=%d\t",p->score); if(j%3==0) printf("\n"); } //方法二: /* for(p=head->next; p!= NULL; p=p->next) printf("%d ",p->score); printf("\n"); */ /* } //销毁链表 void Free_LinkList(NODE *head) { NODE *p,*q; p=head; while (p->next !=NULL) { q = p->next; p->next = q->next; free(q); } free(head); }
    转载请注明原文地址: https://ju.6miu.com/read-26554.html

    最新回复(0)