删除两个双向链表中值相同的结点--无空白头结点

有两个双向链表,头指针为:pListA和pListB,要求删除这两个链表中值相同的结点, C语言实现,结点结构如下:

struct node								// 双向链表结点
{int key;struct node *front, *next;
};

完整源代码如下:

/*功能:删除两个双向链表(都不带头结点)中值(key)相同的结点
*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct node								// 双向链表结点
{int key;struct node *front, *next;
};/*功能:	创建双向链表返回值:1-创建成功,0-创建失败header:	创建的双向链表的头指针n:		待创建的结点个数
*/
int createLinklist(struct node **header, int n)
{int v;struct node *pre, *p;*header = pre = p = NULL;printf("请输入%d个整数:\n", n);while(n-- > 0){scanf("%d", &v);p = malloc(sizeof(struct node));if(p){if(*header == NULL)*header = p;			// 设置链表头指针else{pre->next = p;			p->front = pre;}p->key = v;p->next = *header;			// 新结点的next指向头结点(*header)->front = p;		// 更改头结点的front成员pre = p;}elsereturn 0;					// 创建链表失败}return 1;							// 创建链表成功
}// 输出双向链表中的值
void displayLinklist(struct node *header)
{struct node *p = header;if(NULL != p){do{printf("[p = %X]\tdata = %d, front = %X, next = %X\n", p, p->key, p->front, p->next);p = p->next;}while(p != header);printf("\n");}	
}// 删除双向链表中所有结点并释放空间(头删法)
void FreeLinklist(struct node *header)
{struct node *p;int i = 0;while(header){p = header;if(header->next == header)		// 待删除的是最后一个结点header = NULL;else{header->front->next = header->next;header->next->front = header->front;header = header->next;}free(p);}
}/*功能:		删除双向链表(头指针*pHeader)中值与key相同的结点,从结点*pStart开始向后搜索返回值:	如果从双向链表中删除了值为指定key的结点,返回1,否则返回0pHeader:	双向链表头指针pStart:		从*pStart开始向后搜索,删除值与key相同的结点,直到遇到*pHeaderkey:		待删除结点的值注意:		调用此函数时,输入参数*pHeader==*pStart,程序将会出错
*/
int removeNode(struct node **pHeader, struct node **pStart, int key)
{struct node *p, *temp;int del = 0;p = *pStart;*pStart = NULL;while(p){if(p->key == key){del = 1;temp = p;							// temp指向待删除的结点if(*pHeader == temp)				// 删除头结点{if(*pHeader == temp->next)		// 该头结点是链表的最后一个结点*pHeader = NULL;else{	*pHeader = temp->next;p->front->next = *pHeader;	// 最后一个结点的next指向新的头结点p->next->front = p->front;	// 被删结点的后继结点的front指向被删结点的前驱}p = *pHeader;					// p指向新的头结点}else{p->front->next = p->next;p->next->front = p->front;p = p->next;					// p指向被删除结点的后继结点}free(temp);}else{if(*pStart == NULL)*pStart = p;p = p->next;}if(*pStart && p == *pHeader)break;}return del;
}// 删除两个链表中值相同的结点
void removeEqualNodes(struct node **pHeadA, struct node **pHeadB)
{struct node *p1, *p2;int del = 0;p1 = *pHeadA;while(p1){p2 = *pHeadB;if((del = removeNode(pHeadB, &p2, p1->key)) == 1){removeNode(pHeadA, &p1, p1->key);}elsep1 = p1->next;if(*pHeadB == NULL || *pHeadA == NULL || (del == 0 && p1 == *pHeadA))break;}
}int main(int argc, char *argv[])
{struct node *plistA = NULL, *plistB = NULL;int n1, n2;if(argc < 3){printf("Usage: %s <n1> <n2>\n", argv[0]);return 1;}n1 = atoi(argv[1]);n2 = atoi(argv[2]);createLinklist(&plistA, n1);			// 创建双向链表createLinklist(&plistB, n2);printf("Before remove:\n");displayLinklist(plistA);				// 显示双向链表内容displayLinklist(plistB);removeEqualNodes(&plistA, &plistB);		// 删除两个链表中值相同的结点printf("\nAfter remove:\n");displayLinklist(plistA);displayLinklist(plistB);FreeLinklist(plistA);					// 释放空间FreeLinklist(plistB);return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Enze Second day

哈喽&#xff0c;很高兴在云和学院又学了一天的新知识&#xff0c;现在&#xff0c;我来继续总结一下今天所学的以及对昨天的一些补充。 变量 • 声明变量的语法格式:–数据类型 变量名;•赋值: 变量名值;变量的命名 •命名规则&#xff1a;–1 必须以“字母”_或符号开头…

财务管理(Finance Management)

财务管理是指企业为实现良好的经济效益&#xff0c;在组织企业的财务活动、处理财务关系过程中所进行的科学预测、决策、计划、控制、协调、核算、分析和考核等一系列企业经济活动过程中管理工作的全称&#xff0c;其主要特点是对企业生产和再生产过程中的价值运动进行的管理&a…

微信小程序组件知识点GET

1. 可滚动视图区域组件scroll-view 在滚动 scroll-view 时会阻止页面回弹&#xff0c;所以在 scroll-view 中滚动&#xff0c;是无法触发下拉刷新事件 onPullDownRefresh&#xff0c;所以如果一定要使用下拉刷新&#xff0c;请使用页面的滚动&#xff0c;而不是 scroll-view &…

搭建一台本地json服务器

1、全局安装json-server(此时不管在哪个目录下面都可以) 2、cd至当前的项目文件夹所在的位置&#xff0c;新建一个文件夹jsonserver 3、在当前目录下运行npm init 4、再次安装运行 npm install json-server --save 5、此时的目录结构 --jsonserver--node_moduies--package-loc…

删除两个双向链表中值相同的结点--带空白头结点

有两个双向链表&#xff0c;空白头结点为&#xff1a;ListA和ListB&#xff0c;要求删除这两个链表中关键字相同的结点, C语言实现&#xff0c;结点结构如下&#xff1a; view plainstruct node // 双向链表结点 { int key; struct …

寻求空间支持

寻求支持.NET Framework 3.5以及SQL Server的空间&#xff0c;最好有本地磁盘读写权限&#xff08;特定数据目录&#xff09;。

判断浏览器版本语句大全

<!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> <!--[if IE]> 所有的IE可识别 <![endif]--> <!--[if IE 5.0]> 只有IE5.0可以识别 <![endif]--> <!--[if IE 5]> 仅IE5.0与IE5.5可以识别 <![endif]--> <!--[…

微信小程序API~GET

框架提供丰富的微信原生API&#xff0c;可以方便的调起微信提供的能力&#xff0c;如获取用户信息&#xff0c;本地存储&#xff0c;支付功能等 1. wx.on 开头的 API 是监听某个事件发生的API接口&#xff0c;接受一个 CALLBACK 函数作为参数。当该事件触发时&#xff0c;会调…

如何用DOS命令批量删除文件?(_desktop.ini 或 thumbs.db)

如何用DOS命令批量删除文件&#xff1f;比如viking蠕虫病毒会在系统里产生大量的“_desktop.ini”文件&#xff0c;虽然杀毒后系统无问题了&#xff0c;但看着总归不爽。我们可使用DOS命令批量删除“_desktop.ini”。 点击“开始”→“运行”&#xff0c;输入&#xff1a;“CMD…

Vue CLI3 开启gzip压缩

gizp压缩是一种http请求优化方式&#xff0c;通过减少文件体积来提高加载速度。html、js、css文件甚至json数据都可以用它压缩&#xff0c;可以减小60%以上的体积。 webpack在打包时可以借助 compression webpack plugin 实现gzip压缩&#xff0c;首先需要安装该插件&#xff…

让Sql Server也能出现如VS一样的智能提示工具--资源更新

一个非常实用的小插件&#xff0c;适合Sql Server2005以上版本&#xff0c;免费、无须注册。下面的图片是效果&#xff1a; http://rzhh.com.cn/down/sqlassc.rar 刚刚资源出错了&#xff0c;现在已经更新了资源&#xff0c;请大家下载。 转载于:https://www.cnblogs.com/zhang…

据库中事务、会话、线程这几个概念是什么关系

1、会话可以创建多个事务比如&#xff1a;使用客端连接数据库&#xff0c;这样你就可以执行很多个事务了2、一个事务只能由一个会话产生在数据库里的事务&#xff0c;如果在执行的SQL都是由会话发起的&#xff0c;哪怕是自动执行的JOB也是由系统会话发起的3、一个事务可能会产生…

什么是虚拟化,虚拟化的现状

什么事虚拟化 虚拟化是一个比较广义的概念&#xff0c;在计算机方面通常是指计算元件在虚拟的基础上而不是真实的基础上运行&#xff1b;也可以说是一种解决方案&#xff0c;为了简化管理&#xff0c;最大化利用现有资源。例如&#xff1a;现有有一台服务器&#xff0c;平…

Wireshark数据包分析(一)——使用入门

Wireshark简介&#xff1a; Wireshark是一款最流行和强大的开源数据包抓包与分析工具&#xff0c;没有之一。在SecTools安全社区里颇受欢迎&#xff0c;曾一度超越Metasploit、Nessus、Aircrack-ng等强悍工具。该软件在网络安全与取证分析中起到了很大作用&#xff0c;作为一款…

给控件做数字签名

参考&#xff1a; http://babyt.cnblogs.com/archive/2005/03/14/118302.html http://babyt.cnblogs.com/archive/2005/03/14/118309.html 在控件(.ocx)开发完成后&#xff0c;一般需要将其打成cab包并发布出去&#xff0c;这样当用户的机器上无此控件时&#xff0c;浏览器…