#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)
struct student
{
int num;
char name[8];
char sex[2];
int age;
struct student next;
};
int main()
{
//struct LinkList head = (struct LinkList*)malloc(sizeof(struct LinkList));
struct studenthead = (struct student)malloc(LEN);
struct student *p,*r;
for (int i = 0; i < 4; i++)
{
struct student*s = (struct student*)malloc(LEN);
s->next = NULL;
scanf("%d", &s->num);
scanf("%s", s->name);
scanf("%s", s->sex);
scanf("%d", &s->age);
s->next = head->next;
head->next = s;
}
//以上是建立了一个含有初始值的链表
//删除部分
int ag = 0;
scanf("%d",&ag);
p = head;
while(p->age!=ag&&p->next!=NULL)//循环查找要删除的结点
{
r=p;
p=p->next; //把p的下一个结点给p,所以p就不是原来的p了,原来的p变成了r
if(p->age==ag) //因为头结点没有数值,所以一开始就让p=p->next是对的
{
r->next=p->next;//将要删除结点的前一个结点指向它的下一个结点(原本是要指它的,现在指向它的下一个结点了)(r是要删除结点的前一个结点)
free(p);
} //这里的p->next已经和第38行的p->next不一样了,它是38行的下一个结点了
}
p = head;
while(p->age!=ag&&p->next!=NULL)//循环查找要删除的结点
{
r=p;
p=p->next; //把p的下一个结点给p,所以p就不是原来的p了,原来的p变成了r
if(p->age==ag) //因为头结点没有数值,所以一开始就让p=p->next是对的
{
r->next=p->next;//将要删除结点的前一个结点指向它的下一个结点(原本是要指它的,现在指向它的下一个结点了)(r是要删除结点的前一个结点)
free(p);
}
}
//打印部分
p = head;
while(p->next!=NULL)
{
printf("%d %s %s %d\n", p->next->num, p->next->name, p->next->sex, p->next->age);
p = p->next;
}
return 0;
}
————————————————————————————分割线——————————————————
一个学校关于链表的作业,
使用动态分配内存的方式建立一个链表,从键盘输入4个学生的数据,包括:学号、姓名、性别(m表示男,f表示女)、年龄,并依次插入链表。例如一个学生的数据输入格式为:
101
Ma
m
20
最后从键盘输入一个年龄,如果链表中的节点包含的年龄等于此年龄,则将此节点删去,然后将链表中剩下的节点数据输出。
编写程序,用scanf函数得到输入,求出结果后将其输出,输出格式参考output文件。
这个代码在devC++上正常运行但是返回值并不是0,而且在vscode上会显示应用程序执行异常,返回值:-1073741819;
本题是删除指定年龄的节点,也就是删除链表指定节点