首页 > 其他分享 >创建a、b两个链表,每个链表的结点包含学生学号、姓名。从a链表中删去与b链表中有相同学号的那些结点。

创建a、b两个链表,每个链表的结点包含学生学号、姓名。从a链表中删去与b链表中有相同学号的那些结点。

时间:2024-08-27 21:24:07浏览次数:13  
标签:p2 结点 p1 学号 head 链表 指针

1声明结构体类型

结构体类型struct Student,包含成员学生学号(整型)、姓名(字符数组),next(结构体指针)。声明全局变量n,用于统计结点数量。

struct Student//声明一个全局的结构体类型struct Student
{
	int num;    //学号 
	char name[20];//姓名 
	struct Student *next;//结构体指针,用于指向下一个结点
};

int n;//全局变量n,用于统计结点数量

2.创建链表

定义结构体指针变量

struct Student *p1,*p2,*head;//定义结构体指针p1、p2、head

 用malloc的开辟动态空间,输入结点的信息(学号、姓名),直到链表创建完成。

p2=p1=(struct Student *)malloc(sizeof(struct Student));//p1、p2指向新开辟的结点位置
scanf("%d",&p1->num);//输入学生学号
gets(p1->name);//输入学生姓名
if(n==1) head=p1;//当前结点为第一个结点时,头指针指向新开辟的结点
else p2->next=p1;//当前结点不为头结点时,结点成员next指向新开辟的结点 
p2=p1;//将p1赋给p2 ,p2也指向新开辟的结点 

3.查找两链表中有相同学号的结点

定义结构体指针变量和判断标志,统计a链表结点个数。

 struct Student *p1,*p2,*p3; //定义结构体指针p1、p2、P3
 int flag=0;                //定义判断学号相等的标志
 p1=pa_head;               //p1指向a链表表头 
 p2=pb_head;               //p2指向b链表表头
 while(p1!=NULL)           //统计a链表结点个数,当p1为空时结束 
 {   
	n=n+1;                  
	p1=p1->next;
 }

利用双层while循环,每选中a链表中的一个结点,b链表就从头结点开始遍历,比较两个结点中的学号。每找到相同学号的结点,就执行一次删除操作。

 p1=pa_head;            //p1重新指向a链表表头  
 while(p1!=NULL)        //外层a链表循环,当p1为空时结束 
 {
 	p2=pb_head;        //每次内循环开始前,p2重新指向b链表表头
 	while(p2!=NULL)    //内层b链表循环,当p2为空时结束
 	{
 		if(p1->num==p2->num)//当两链表结点成员学号相同 
 		{ 
 		    flag=1;   //判断标志置1 
 		    p3=p1;    //结构体指针p3保存当前结点位置 
 		    p1=p1->next;//指针变量p1指向a链表下一结点位置 
 			pa_head=delet_note(pa_head,p3);//调用删除链表结点的函数,参数为a链表头指针、指向删除结点的指针 
 			p3=NULL;   //执行删除操作后将结构体指针p3置空 
 			break;     //退出内循环 
		}
		else
		p2=p2->next;//p2指向b链表下一结点 
	}
	if(flag==1) flag=0;//判断标志置零,为下一次判断做准备 
	else p1=p1->next; //p1指向a链表下一结点 
  }

4.删除结点

定义结构体指针变量、相关整型变量,查询目标结点的序号(即第几个结点)。

	struct Student *head,*pt;//定义结构体指针head、pt 
	int j,m=0;                 //定义整型变量j、m,j用于循环,m用于判断删除结点的位置 
	pt=head=pa_head;         //head、pt初始化指向a链表表头                    
	while(pa_head!=NULL)     //查询目标结点位置 
	{   
	    m=m+1;              //m自加1 
	    if(pa_head==p) break;//找到目标位置,退出循环 
		else pa_head=pa_head->next;//pa_head指向a链表下一结点 
	}

目标结点为头结点时

head=head->next;//将头指针指向原链表第二个结点
free((void *)pa_head);//释放原来表头结点占用的空间
pa_head=NULL;//将NULL赋给pa_head,防止p成为野指针

目标结点为其它结点时

for(j=1;j<m-1;j++) pt=pa_head=pa_head->next;//利用循环使pt、pa_head指向目标位置的前一个结点。
pt=pt->next;//pt指向目标位置的结点
pa_head->next=pt->next; //目标位置的前一个结点成员next指向目标位置的下一个结点
free((void *)pt);//释放删除结点占用的空间
pt=NULL;//将NULL赋给pt,防止pt成为野指针

5.输出链表

定义结构体指针指向头指针,利用循环依次输出链表结点。

	struct Student *p;//定义结构体指针p
	p=head;//结构体指针p指向头指针
	if(head!=NULL)//如果不是空链表 
	do
	{
	 printf("学号:%d\n",p->num);//输出学生学号、姓名 
	 printf("姓名:");
	 puts(p->name);//输出学生、姓名
	 p=p->next;	//p指向下一结点
	}while(p!=NULL); //当p=NULL输出完成

上述所有程序为部分代码,详情代码有偿,见链接。

https://item.taobao.com/item.htm?id=827901675197icon-default.png?t=N7T8https://item.taobao.com/item.htm?id=827901675197

6.运行结果

从键盘输入a、b链表结点信息(学生学号、姓名)

输出a、b链表 

输出新链表

标签:p2,结点,p1,学号,head,链表,指针
From: https://blog.csdn.net/weixin_45755708/article/details/141527377

相关文章

  • 数据结构——链表
    单链表基本概念顺序表:顺序存储的线性表。链式表:链式存储的线性表,简称链表。既然顺序存储中的数据因为挤在一起而导致需要成片移动,那很容易想到的解决方案是将数据离散地存储在不同内存块中,然后在用来指针将它们串起来。这种朴素的思路所形成的链式线性表,就是所谓的链表......
  • 链表-单链表的基本操作及C语言代码实现
    1.遍历单链表(打印,修改)便利的概念想必大家都不会陌生,即就是从链表的头开始,逐步向后进行每一个元素的访问,这就是遍历,对于遍历操作,我们可以衍生出很多常用的数据操作,比如说查询元素,修改元素,获取元素个数,打印整个链表数据等等。进行遍历的思路极其简单,只需要建立一个指向链表L的......
  • 链表-双向链表的基本设计(C语言代码实现)
    1.双向链表的简介&概念单链表在很多时候已经可以胜任很多优秀的操作了,但是,单链表任然存在不足,所谓‘单链表’,是指结点中只有一个指向其后继的指针,具有单向性,有时需要搜索大量数据的时候,就必须要多次进行从头开始的遍历,这样的搜索不是很便利。图:单链表示意图对此在单链表的......
  • javascript怎么实现链表?
    在JavaScript中实现链表通常涉及定义一个链表节点类(通常称为ListNode)和一个链表类(例如LinkedList),然后在这个链表类中实现各种操作链表的方法,如添加节点、删除节点、遍历链表等。以下是使用JavaScript实现单向链表的一个基本示例:链表节点类(ListNode)首先,我们定义一个链表节点......
  • 【链栈的实现】--------本质为不带头结点的 头插法建立起来的单链表
    1.链栈的基本属性与特征:链栈是运算受限的单链表,只能在链表头部进行操作2.链栈的相关基础操作汇总初始化操作:操作结果:构造一个空栈S。InitStack(LinkStack*s)判定S是否为空栈:初始条件:栈S已存在操作结果:若栈S为空栈,则返回TRUE,否则FALSE.StackEmpty(LinkStack......
  • 两数相加 链表C++
    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0 开头。示例1:输入:l1=[2,4,3],l2=[5,......
  • (算法)最⻓公共前缀————<链表—模拟>
    1.题⽬链接:14.最⻓公共前缀2.题⽬描述:3.解法:算法思路:解法⼀(两两⽐较):我们可以先找出前两个的最⻓公共前缀,然后拿这个最⻓公共前缀依次与后⾯的字符串⽐较,这样就可以找出所有字符串的最⻓公共前缀。C++算法代码: classSolution{public: stringlongestCommonPr......
  • (算法)K个⼀组翻转链表————<链表—模拟>
    1.题⽬链接:25.K个⼀组翻转链表2.题⽬描述:3.解法(模拟):算法思路:本题的⽬标⾮常清晰易懂,不涉及复杂的算法,只是实现过程中需要考虑的细节⽐较多。我们可以把链表按K个为⼀组进⾏分组,组内进⾏反转,并且记录反转后的头尾结点,使其可以和前、后连接起来。思路⽐较简单,但是实......
  • LeetCode之链表类题目
    链表类题目之CPP版......
  • 力扣: 设计链表
    文章目录需求代码结尾需求你可以选择使用单链表或者双链表,设计并实现自己的链表。单链表中的节点应该具备两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果是双向链表,则还需要属性prev以指示链表中的上一个节点。假设链表中的......