小甲鱼链表删除
实现链表的输出:
首先要知道链表第一个结点的地址,也就是要知道head的值。
然后设一个指针变量p,先指向第一个结点,输出p所指的结点,然后使p后移一个结点,再输出,直到链表的危结点。
如此我们得到这样的流程图:
对链表的删除操作:
从一个动态链表中删去一个结点,并不是真正从内存中把它抹掉,而是把它从链表中分离开来,只要撤销原来的链接关系即可。如图:
链表删除练习:
题目:写一函数以删除动态链表中指定的结点。
解题思路:
1、从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个学号。
2、如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。
3、可以设两个指针变量p1和p2,先使p1指向第一个结点。
4、如果要删除的不是第一个结点,则使p1后移指向下一个结点(将p1->next赋给p1)在此之前应将p1的值p2,使p2指向刚才检查过的那个结点。
5、综上可得出流程图:
源码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#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;
}
运行结果: