定义恰当的结构体,并编程实现下列函数,main()函数将调用这些函数,实现学生链表的创建、打印和删除节点的功能;
(1)create(n),从控制台输入n个学生的信息,建立链表存储这些信息,返回链表的头节点指针;学生信息包括:学号(字符串,少于20分字符)、姓名(字符串,少于10个字符)、性别(0表示女生、1表示男生)、年龄。
(2)pdelete(head,age),从head指向的链表搜索学生信息,当学生的年龄等于age时,将该节点删除;返回链表的头节点指针;
(3)print(head),输出删除后剩余学生的信息
输入样例:
(1)第一行输入学生数量n;
(2)后面输入n个学生信息,每一行输入一个学生的信息(依次为学号、姓名、性别、年龄)
(3)最后输入从链表中要删除学生的年龄。
如:
5
2021001 zhanli 1 20
2021002 liming 2 21
2021003 wuhang 1 22
2021004 mingti 2 21
2021005 lisung 2 21
21
输出样例:
输出删除了指定年龄后、剩余所有学生节点的信息(每个学生信息输出一行)。
2021001 zhanli 1 20
2021003 wuhang 1 22
代码如下:
#include<stdio.h>
#include<stdlib.h>
//定义一个结构体
struct student
{
char num[20];
char name[10];
int sex, age;
struct student* next;
};
//输入链表中学生的信息
struct student* create(int n)
{
struct student* pnew, * head, * ptail;//输入信息是三个指针 *head *pnew *ptail
int i;
//对头节点处理
pnew = (struct student*)malloc(sizeof(struct student));//建立节点
scanf("%s %s %d %d", pnew->num, pnew->name, &pnew->sex, &pnew->age);//储存学生信息
head = ptail = pnew;//头、尾节点指向pnew
//储存剩余 n - 1 个节点
for (i = 1; i < n; i++)
{
pnew = (struct student*)malloc(sizeof(struct student));
scanf("%s %s %d %d", pnew->num, pnew->name, &pnew->sex, &pnew->age);
ptail->next = pnew;//将新的节点链接在尾节点后面
ptail = pnew;//将尾节点指向新的节点
}//for
ptail->next = NULL;//最后尾节点的next指向NULL
return head;//返回头节点的指针
}//create
//删除节点
struct student* pdelete(struct student *head, int age)//形参为头节点指针
{
struct student* pold, * p;//删除节点两个指针 *pold *p
//对头节点处理
p = head;//将指针指向要处理的对象,方便后续释放内存空间
while (head != NULL && head->age == age)
{
head = head->next;//删除头节点,直接将head移向下一个
free(p);//释放内存
p = head;//重新指向要处理的对象,避免出现野指针
}//while
if (head == NULL)//如果该链表为空则直接返回head
return head;
//对之后的节点进行处理
p = p->next;//指向下一个节点
pold = head;//始终前后要链接在一起
while (p != NULL)
{
if (p->age == age)//如果满足删除条件
{
pold->next = p->next;
free(p);
p = pold->next;
}//if
else
{
pold = pold->next;//逐一指向下一个节点
p = pold->next;
}//else
}//while
return head;
}//pdelete
//输出链表中所有学生节点信息
void print(struct student *head)
{
struct student *p=head;
if(head==NULL)//如果为空链表则输出链表为空!
printf("链表为空!");
while(p!=NULL)
{
printf("%s %s %d %d\n",p->num,p->name,p->sex,p->age);
p=p->next;
}//while
}print
int main()
{
struct student *head;
int n,age;
scanf("%d",&n);
head=create(n);//创建链表
scanf("%d",&age);
head=pdelete(head,age);//删除指定的年龄
print(head);//打印剩余节点
return 0;
}