链表的删除操作 您所在的位置:网站首页 链表怎么实现的 链表的删除操作

链表的删除操作

2023-11-07 09:23| 来源: 网络整理| 查看: 265

小甲鱼链表删除

实现链表的输出: 首先要知道链表第一个结点的地址,也就是要知道head的值。 然后设一个指针变量p,先指向第一个结点,输出p所指的结点,然后使p后移一个结点,再输出,直到链表的危结点。 如此我们得到这样的流程图: 在这里插入图片描述

对链表的删除操作: 从一个动态链表中删去一个结点,并不是真正从内存中把它抹掉,而是把它从链表中分离开来,只要撤销原来的链接关系即可。如图: 在这里插入图片描述

链表删除练习: 题目:写一函数以删除动态链表中指定的结点。 解题思路: 1、从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个学号。 2、如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。 3、可以设两个指针变量p1和p2,先使p1指向第一个结点。 4、如果要删除的不是第一个结点,则使p1后移指向下一个结点(将p1->next赋给p1)在此之前应将p1的值p2,使p2指向刚才检查过的那个结点。 5、综上可得出流程图: 在这里插入图片描述 源码:

#include #include #include #define LEN sizeof(struct student)//student结构的大小 struct student *creat();//创建链表 struct student *del(struct student *head,int num);//del函数用于删除结点,*head即链表 //的头指针,num是要删除的结点num。 void print(struct student *head);//打印链表 struct student { int num; float score; struct student *next; }; int n;//全局变量,用来记录存放了多少数据。 void main() { struct student *stu,*p; int n; stu = creat(); p = stu; print(p); printf("Pls enter the num to delete: "); scanf("%d",&n); print(del(p,n)); printf("\n\n"); system("pause"); } struct student *creat() { struct student *head; struct student *p1,*p2; p1 = p2 = (struct student *)malloc(LEN);//LEN是student结构的大小 printf("Pls enter the num: "); scanf("%d",&p1->num); printf("Pls enter the score: "); scanf("%f",&p1->score); head = NULL; n = 0; while(p1->num) { n++; if(1 == n) { head = p1; } else { p2->next = p1; } p2 = p1; p1 = (struct student *)malloc(LEN); printf("\nPls enter the num: "); scanf("%d",&p1->num); printf("Pls enter the score: "); scanf("%f",&p1->score); } p2->next = NULL; return head; } void print(struct student *head) { struct student *p; printf("\nThere are %d records!\n\n",n); p = head; if(head) { do { printf("学号为 %d 的成绩是:%f\n",p->num,p->score); p = p->next; }while(p); } } struct student *del(struct student *head ,int num) { struct student *p1,*p2; if(NULL == head)//如果头指针指向NULL,这是一个空链表。 { printf("\nThis list is NULL\n"); goto end; } p1 = head; while(p1->num != num && p1->next != NULL) { p2 = p1; p1 = p1->next; } if(num == p1->num) { if(p1 == head)//当将要删除的结点位于头结点的时候 { head = p1->next; } else //一般情况 { p2->next = p1->next; } printf("\nDelete No: %d succeed!\n",num); n = n-1;//n是作为一个全局变量,用来记录链表的数据数。 } else { printf("%d not been found!\n",num); } end: return head; }

运行结果: 在这里插入图片描述 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有