问题遇到的现象和发生背景
建立一个链表,每个结点包括……,输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删去
还有一个年龄19没删掉,循环执行到尾结点的前驱结点循环就终止了,怎么解决?
用代码块功能插入代码,请勿粘贴截图
#pragma warning(disable : 4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN (sizeof(struct Student))
typedef struct Student
{
long num;
char name[20];
char sex[10];
int age;
struct Student* next;
}student;
int main()
{
student* creat(int n);
student* del(student * head, int a_ge);
void print(student * head);
void fr(student * head);
student* head;
int n, age;
printf("please enter the number of students:");
scanf("%d", &n);
head = creat(n);
printf("please enter an age:");
scanf("%d", &age);
printf("\n");
del(head, age);
printf("modified student data:\n");
print(head);
fr(head);
return 0;
}
student* creat(int n)
{
int i;
student* head, * node, * end; //头结点, 普通结点, 尾指针
head = (student*)malloc(LEN);
if (head == NULL)
{
printf("out of memory, the request failed!\n");
exit(-1);
}
memset(head, 0, LEN);
end = head; //尾指针指向头结点,空表
printf("please enter the student number, name, gender, age :\n");
for (i = 0; i < n; i++)
{
node = (student*)malloc(LEN);
if (node == NULL)
{
printf("out of memory, the request failed!\n");
exit(-1);
}
memset(node, 0, LEN);
end->next = node;
end = node;
scanf("%ld %s %s %d", &node->num, node->name, node->sex, &node->age);
printf("\n");
}
return head;
}
student* del(student* head, int a_ge)
{
student* p;
student* pt; //中间变量
for (p = head; p->next != NULL; p = p->next) //p开始指向头结点,循环结束条件:当p指向尾结点的前驱结点
{
if (p->next->age == a_ge) //若p的后驱结点等于输入的数值
{
pt = p->next;
p->next = pt->next; //删除满足条件的结点
free(pt);
pt = NULL;
}
}
return head;
}
void print(student* head)
{
student* p;
for (p = head->next; p != NULL; p = p->next)
{
printf("%ld\t%s\t%s\t%d\n", p->num, p->name, p->sex, p->age);
}
}
void fr(student* head)
{
student* p;
for (p = head; p != NULL;)
{
p = p->next;
free(p);
p = NULL;
}
}
运行结果及报错内容
please enter the number of students:4
please enter the student number, name, gender, age :
101 Ma m 20
102 Li f 23
103 Zhang m 19
104 Wang m 19
please enter an age:19
modified student data:
101 Ma m 20
102 Li f 23
104 Wang m 19