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

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

时间:2024-08-27 21:24:23浏览次数:8  
标签:p2 结点 p1 指向 next 链表 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.运行结果

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

输出原来链表

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

标签:p2,结点,p1,指向,next,链表,C语言
From: https://blog.csdn.net/weixin_45755708/article/details/141594372

相关文章

  • 创建a、b两个链表,每个链表的结点包含学生学号、姓名。从a链表中删去与b链表中有相同
    1声明结构体类型结构体类型structStudent,包含成员学生学号(整型)、姓名(字符数组),next(结构体指针)。声明全局变量n,用于统计结点数量。structStudent//声明一个全局的结构体类型structStudent{ intnum;//学号 charname[20];//姓名 structStudent*next;//结构体指......
  • 数据结构——链表
    单链表基本概念顺序表:顺序存储的线性表。链式表:链式存储的线性表,简称链表。既然顺序存储中的数据因为挤在一起而导致需要成片移动,那很容易想到的解决方案是将数据离散地存储在不同内存块中,然后在用来指针将它们串起来。这种朴素的思路所形成的链式线性表,就是所谓的链表......
  • C语言字符函数和字符串函数的详解及模拟实现(超详细)
    目录1.求字符串长度1.1strlen1.1.1.strlen函数介绍1.1.2.strlen函数模拟实现 2.长度不受限制的字符串函数 2.1strcpy2.1.1.strcpy函数介绍2.1.2.strcpy函数模拟实现 2.2strcat2.2.1.strcat函数介绍2.2.2.strcat函数模拟实现 2.3strcmp 2.3.1.strcmp函数介绍......
  • C语言数据类型
    关键字的介绍数据类型关键字有12个:控制语句关键字有12个:存储类型关键字有4个:其他关键字有4个:字符和ASCII码的介绍数据介绍什么是数据类型?数据类型的具体组成字符:整形:浮点型布尔类型数据类型的取值范围关键字的介绍C语言的关键字有:1、数据类型关键字2、控制语......
  • C++与C语言中基础数据类型详解
    目录引言基础数据类型分类实际编程中的应用建议结论引言在C++与C语言的编程世界中,理解并正确使用基础数据类型是每个程序员的必备技能。不同的数据类型在内存中的占用和表示方式直接影响到程序的性能和行为。本文将详细介绍C++与C语言中常见的基础数据类型,探讨它们......
  • 探索C语言中数组作为函数参数的奥秘
    在C语言的世界里,数组是一种基础且强大的数据结构,它允许我们存储相同类型的数据集合。然而,在处理函数和数组的关系时,尤其是在数组作为函数参数传递时,初学者往往会感到困惑。今天,我们就来深入探讨这一话题,通过具体的代码示例来揭开其神秘面纱。数组作为函数参数的两种形式在C语......
  • 全网最易懂的解题——C语言“打印一个数的每一位(递归)”
    很简单吧递归我们做了很多题,逆序打印数字和逆序打印数组我们也做过代码就直接附上了voidmy_print(intnum){ if(num<10)//说明只有一位数字 { printf("%d",num); } else { my_print(num/10); printf("%d",num%10); }}//打印数字的每一位intmain(......
  • 全网最易懂的解题——C语言“求斐波那契数(递归)”
    那先来知道什么是斐波那契数列吧前两个数相加等于第三个数,如果其中数字都满足此条件,那么这就是斐波那契数列 现在我们要求第n个斐波那契数,代码框架先搭出来吧,找斐波那契数的函数就命名为Fib吧//求斐波那契数intmain(){ intn=0; printf("请输入你想知道第几个斐波......
  • 链表-单链表的基本操作及C语言代码实现
    1.遍历单链表(打印,修改)便利的概念想必大家都不会陌生,即就是从链表的头开始,逐步向后进行每一个元素的访问,这就是遍历,对于遍历操作,我们可以衍生出很多常用的数据操作,比如说查询元素,修改元素,获取元素个数,打印整个链表数据等等。进行遍历的思路极其简单,只需要建立一个指向链表L的......
  • 链表-双向链表的基本设计(C语言代码实现)
    1.双向链表的简介&概念单链表在很多时候已经可以胜任很多优秀的操作了,但是,单链表任然存在不足,所谓‘单链表’,是指结点中只有一个指向其后继的指针,具有单向性,有时需要搜索大量数据的时候,就必须要多次进行从头开始的遍历,这样的搜索不是很便利。图:单链表示意图对此在单链表的......