C语言程序设计:链表删除相关结点

       创建一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。

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=828559867761icon-default.png?t=N7T8https://item.taobao.com/item.htm?id=828559867761

6.运行结果

从键盘输入链表结点信息(学号、姓名、性别、年龄)

输出原来链表

 输入删除的目标年龄、输出删除相关结点后的新链表

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值