有两个双向链表,头指针为: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;
}

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

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

    有两个双向链表,空白头结点为:ListA和ListB,要求删除这两个链表中关键字相同的结点, C语言实现,结点结构如下: view plain struct node                  ...

  2. php两个数组去掉相同的,php如何删除两个数组中相同的数据

    php如何删除两个数组中相同的数据 发布时间:2021-03-12 10:27:42 来源:亿速云 阅读:77 作者:小新 这篇文章给大家分享的是有关php如何删除两个数组中相同的数据的内容.小编觉得 ...

  3. js删除两个集合中共同元素_多个集合中的共同和独特元素

    js删除两个集合中共同元素 本周,我们将暂时中断较高级别的问题和技术文章,以解决我们中许多人可能面临的一些代码问题. 没什么花哨的或太辛苦的,但是有一天它可能会节省您15分钟的时间,偶尔回到基础上也很 ...

  4. 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= ...

  5. 删除无序单链表中值重复出现的节点

    题目: 给定一个无序单链表的头节点head,删除其中值重复出现的节点. 请按以下要求实现两种方法. 方法一.时间复杂度O(N) 方法二.空间复杂度O(1) 基本思路   方法一.利用哈希表,依次遍历每 ...

  6. 链表问题13——删除无序单链表中值重复出现的节点

    题目 给定一个无序单链表的头节点head,删除其中值重复出现的节点. 原链表 删除后 1->2->3->3->4->2->4->1 1->2->3 ...

  7. vue 删除两个集合中相同的数据_vue.js如何删除数组里面的数据

    vue.js如何删除数组里面的数据 发布时间:2020-12-10 12:04:44 来源:亿速云 阅读:107 作者:小新 这篇文章主要介绍了vue.js如何删除数组里面的数据,具有一定借鉴价值,需 ...

  8. mysql 删除另一个表中的_mysql – 在一个查询SQL中删除两个表中的记录

    我有两张桌子 EMPGROUP_TBL SEQID | MASTERID | BUSINESS_UNIT | DIVISION | SUB_DIVISION | CLASSIFICATION | SU ...

  9. 删除两个字符串中的特定字符使其相等,统计删除的字符的ASCII和

    为什么80%的码农都做不了架构师?>>>    Minimum ASCII Delete Sum for Two Strings 问题: Given two strings s1, ...

最新文章

  1. SQL函数---SQL HAVING 子句
  2. selenium启动Firefox示例
  3. 『前端干货篇』:你不知道的Stylus
  4. python数据库优化_Python学习(二十九)—— pymysql操作数据库优化
  5. 几个基本概念辨析:流敏感,路径敏感和上下文敏感
  6. Java 中的 Reference
  7. python找人_python之找最后一个人
  8. linux php环境搭建 图文教程,linux php环境搭建教程
  9. 104_Power Query 数据库条件查询
  10. Python开发过程中17个坑
  11. 使用animate()的时候,有时候会出现移进移出的闪动问题
  12. cuda10.0及其驱动纯净卸载(笔记)
  13. 海量数据搜索——搜索引擎
  14. 7-4 走迷宫II(Dijkstra 算法)
  15. cortana连不上网络_Alexa,为什么Cortana仍在我的计算机上?
  16. 2022全国职业技能大赛-网络系统管理-Debian模块:CA证书服务
  17. 在Geany里配置python3的方法!!!含window10下载Geany过程
  18. recyclerview滚动到指定条目
  19. 苹果发布会总结:全新 iMac、iPad Pro、 紫色 iPhone 12 和 AirTag 登场
  20. REVIT 卸载工具,完美彻底卸载清除干净revit各种残留注册表和文件

热门文章

  1. bigquery_在BigQuery中链接多个SQL查询
  2. 抽象类细分举行_什么是用聚类技术聚类的客户细分
  3. Keras框架:Alexnet网络代码实现
  4. leetcode51. N 皇后(回溯算法)
  5. win10管理凌乱桌面_用于管理凌乱的开源存储库的命令行技巧
  6. JavaScript中的基本表单验证
  7. redux扩展工具_用鸭子扩展您的Redux App
  8. 裁判打分_内在的裁判偏见
  9. 创意产品 分析_使用联合分析来发展创意
  10. [floyd+路径输出]HDU1385 Minimum Transport Cost