删除两个双向链表中值相同的结点--无空白头结点
有两个双向链表,头指针为: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;
}
删除两个双向链表中值相同的结点--无空白头结点相关推荐
- 删除两个双向链表中值相同的结点--带空白头结点
有两个双向链表,空白头结点为:ListA和ListB,要求删除这两个链表中关键字相同的结点, C语言实现,结点结构如下: view plain struct node ...
- php两个数组去掉相同的,php如何删除两个数组中相同的数据
php如何删除两个数组中相同的数据 发布时间:2021-03-12 10:27:42 来源:亿速云 阅读:77 作者:小新 这篇文章给大家分享的是有关php如何删除两个数组中相同的数据的内容.小编觉得 ...
- js删除两个集合中共同元素_多个集合中的共同和独特元素
js删除两个集合中共同元素 本周,我们将暂时中断较高级别的问题和技术文章,以解决我们中许多人可能面临的一些代码问题. 没什么花哨的或太辛苦的,但是有一天它可能会节省您15分钟的时间,偶尔回到基础上也很 ...
- JS删除两个数组中相同的某个对象值
var arr1=[{id:1},{id:2},{id:3},{id:4},{id:5}] var arr2=[{id:1},{id:2},{id:3}] var set=arr2.map(item= ...
- 删除无序单链表中值重复出现的节点
题目: 给定一个无序单链表的头节点head,删除其中值重复出现的节点. 请按以下要求实现两种方法. 方法一.时间复杂度O(N) 方法二.空间复杂度O(1) 基本思路 方法一.利用哈希表,依次遍历每 ...
- 链表问题13——删除无序单链表中值重复出现的节点
题目 给定一个无序单链表的头节点head,删除其中值重复出现的节点. 原链表 删除后 1->2->3->3->4->2->4->1 1->2->3 ...
- vue 删除两个集合中相同的数据_vue.js如何删除数组里面的数据
vue.js如何删除数组里面的数据 发布时间:2020-12-10 12:04:44 来源:亿速云 阅读:107 作者:小新 这篇文章主要介绍了vue.js如何删除数组里面的数据,具有一定借鉴价值,需 ...
- mysql 删除另一个表中的_mysql – 在一个查询SQL中删除两个表中的记录
我有两张桌子 EMPGROUP_TBL SEQID | MASTERID | BUSINESS_UNIT | DIVISION | SUB_DIVISION | CLASSIFICATION | SU ...
- 删除两个字符串中的特定字符使其相等,统计删除的字符的ASCII和
为什么80%的码农都做不了架构师?>>> Minimum ASCII Delete Sum for Two Strings 问题: Given two strings s1, ...
最新文章
- SQL函数---SQL HAVING 子句
- selenium启动Firefox示例
- 『前端干货篇』:你不知道的Stylus
- python数据库优化_Python学习(二十九)—— pymysql操作数据库优化
- 几个基本概念辨析:流敏感,路径敏感和上下文敏感
- Java 中的 Reference
- python找人_python之找最后一个人
- linux php环境搭建 图文教程,linux php环境搭建教程
- 104_Power Query 数据库条件查询
- Python开发过程中17个坑
- 使用animate()的时候,有时候会出现移进移出的闪动问题
- cuda10.0及其驱动纯净卸载(笔记)
- 海量数据搜索——搜索引擎
- 7-4 走迷宫II(Dijkstra 算法)
- cortana连不上网络_Alexa,为什么Cortana仍在我的计算机上?
- 2022全国职业技能大赛-网络系统管理-Debian模块:CA证书服务
- 在Geany里配置python3的方法!!!含window10下载Geany过程
- recyclerview滚动到指定条目
- 苹果发布会总结:全新 iMac、iPad Pro、 紫色 iPhone 12 和 AirTag 登场
- REVIT 卸载工具,完美彻底卸载清除干净revit各种残留注册表和文件
热门文章
- bigquery_在BigQuery中链接多个SQL查询
- 抽象类细分举行_什么是用聚类技术聚类的客户细分
- Keras框架:Alexnet网络代码实现
- leetcode51. N 皇后(回溯算法)
- win10管理凌乱桌面_用于管理凌乱的开源存储库的命令行技巧
- JavaScript中的基本表单验证
- redux扩展工具_用鸭子扩展您的Redux App
- 裁判打分_内在的裁判偏见
- 创意产品 分析_使用联合分析来发展创意
- [floyd+路径输出]HDU1385 Minimum Transport Cost