创建一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
1.声明结构体类型
结构体类型struct Student,包含成员学生学号(整型)、学生姓名(字符数组)、性别(字符型)、年龄(整型),next结构体指针。声明全局变量n,用于统计链表结点个数。
struct Student//声明一个全局的结构体类型
{
int num;//学号
char name[20];//姓名
char sex;//性别
int age;//年龄
struct Student *next;//用于指向下一个结点
};
int n;//全局变量n,用于统计结点数量
2.创建链表
定义相关结构体指针变量
struct Student *head,*p1,*p2;//定义结构体指针p1、p2、head
在循环体中用malloc(函数)开辟大小为sizeof(struct Student)的连续空间,输入每个结点的信息(学号、姓名、性别、年龄),结构体指针p1用于指向新开辟的结点位置,p2用于尾随p1并将该结点成员next指向新结点,最后一个结点信息输入完成就退出循环,并将NULL赋给最后一个结点的成员next,完成链表创建。
p2=p1=(struct Student *)malloc(sizeof(struct Student));//p1、p2指向新开辟的结点位置
scanf("%d",&p1->num);//输入学号
gets(p1->name);//输入姓名
scanf("%c",&p1->sex);//输入性别
scanf("%d",&p1->age);//输入年龄
if(n==1) head=p1;//当前结点为第一个结点时,头指针指向新开辟的结点
else p2->next=p1;//当前结点不为头结点时,结点成员next指向新开辟的结点
p2=p1;//将p1赋给p2 ,p2也指向新开辟的结点
3.输入年龄,并在链表结点成员中查找、删除与此年龄相等的相关结点
定义结构体指针指向链表表头,整型变量k用于判断目标结点位置(即第几个结点)。
struct Student *p;//定义结构体指针p
int k=0; //删除结点序号(即第几个结点)
p=head; //结构体指针p指向链表表头
从键盘输入删除的目标年龄,利用循环遍历链表每个结点中的年龄信息,若相等则执行删除结点的操作。
int age; //目标删除年龄,从键盘输入
scanf("%d",&age);//输入删除的年龄
do
{
k=k+1;//序号加1
if(p->age==age) //结点年龄等于目标删除年龄
{
p=p->next; //先使p指向下一结点
head=delet_linkedlist(head,k);//删除结点操作
k=k-1;//删除完成、序号减1
}
else p=p->next;//p指向下一结点
}while(p!=NULL);//当p等于NULL结束循环
4.删除结点
定义相关结构体指针变量和整型变量
struct Student *p1,*p2;//定义结构体指针p1、p2
int i;//定义整型变量i用于循环
p2=p1=head;//p1、p2初始化指向链表表头
当删除目标结点为链表头结点时
head=head->next;//将头指针指向原链表第二个结点
free((void *)p1);//释放原来表头结点占用的空间
p2=p1=NULL;//将NULL赋给p1、p2
当删除目标结点为链表其它结点时
for(i=1;i<m-1;i++)p2=p1=p1->next;//利用循环使p1、p2指向目标位置的前一个结点。
p2=p2->next;//p2指向目标位置的结点
p1->next=p2->next;//目标位置的前一个结点成员next指向目标位置的下一个结点
free((void *)p2);//释放删除结点占用的空间
p2=NULL;//将NULL赋给p2,防止p2成为野指针
5.输出链表
定义结构体指针指向表头结点,利用循环依次输出链表结点。
printf("\n输出新链表\n");
struct Student *p;//定义结构体指针p
p=head;//结构体指针p指向头指针
if(head!=NULL)//如果不是空链表
do
{
printf("\n学号:%d\n姓名:%s\n性别:%c\n年龄:%d\n",p->num,p->name,p->sex,p->age);
p=p->next;//p指向下一结点
}while(p!=NULL);//当p=NULL输出完成
上述所有程序为部分代码,详情代码有偿,见链接。
https://item.taobao.com/item.htm?id=828559867761https://item.taobao.com/item.htm?id=828559867761
6.运行结果
从键盘输入链表结点信息(学号、姓名、性别、年龄)
输出原来链表
输入删除的目标年龄、输出删除相关结点后的新链表
标签:p2,结点,p1,指向,next,链表,C语言 From: https://blog.csdn.net/weixin_45755708/article/details/141594372