鱼C论坛

 找回密码
 立即注册
查看: 2487|回复: 2

多单链表删除操作遇到问题

[复制链接]
发表于 2023-3-8 20:47:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目描述:
本关任务:已知A、B和C为3个递增有序的线性表,现要求对A表做如下操作,删除那些既在B中出现,也在C中出现的元素。以带表头结点的单链表作为线性表的物理结构,编写实现上述操作的算法。
函数原型:void  TriLinkList(LinkList  A,LinkList  B,LinkList  C);

我的代码:
  1. void TriLinkList(LinkList A, LinkList B, LinkList C) {
  2.     LinkList p1 ,p2,p3 ,prior = A;
  3.     int sign = 0;
  4.     for(p1 = A->next;p1!=NULL ;){
  5.         for(p2 = B->next ;p2 != NULL ;p2= p2->next){
  6.             if(p2->data==p1->data){//查找B中是否有该元素
  7.                 for(p3 = C->next ; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素

  8.                     if(p3->data==p1->data){
  9.                         prior->next = p1->next;//删除节点操作
  10.                         free(p1);
  11.                         p1=prior -> next;
  12.                         sign = 1;//表示已删除一个节点
  13.                         break;
  14.                     }
  15.                 }
  16.             }
  17.             if(sign==1){
  18.                 sign = 0;
  19.                 break;
  20.             }
  21.         }
  22.         if (sign == 0) {
  23.             prior=prior -> next;//查找下一个节点
  24.             p1=prior -> next;
  25.         }
  26.     }
  27. }
复制代码


测试出现错误的数据:
输入:
11  13  25  27  29  30  36  42  50  0
3  9  10  11  13 30 42 0
3  6  7  9 11  13  42 50  0
预期输出:
25 27 29 30 36 50
实际输出:
13 25 27 29 30 36 50

实在不知道是哪里的问题,求指点!感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-3-8 22:51:22 | 显示全部楼层
本帖最后由 jhq999 于 2023-3-8 22:54 编辑
  1. /*11  13  25  27  29  30  36  42  50  0
  2. 3  9  10  11  13 30 42 0
  3. 3  6  7  9 11  13  42 50  0*/
  4. void TriLinkList(LinkList A, LinkList B, LinkList C) {
  5.     LinkList p1 ,p2,p3 ,prior = A;
  6.     int sign = 0;
  7.     for(p1 = A->next;p1!=NULL ;){/////////////////////////p1->data=11
  8.         for(p2 = B->next ;p2 != NULL ;p2= p2->next){
  9.             if(p2->data==p1->data){//查找B中是否有该元素
  10.                 for(p3 = C->next ; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素

  11.                     if(p3->data==p1->data){
  12.                         prior->next = p1->next;//删除节点操作////////// prior->next->data=13
  13.                         free(p1);
  14.                         p1=prior -> next;///////////////p1->data=13
  15.                         sign = 1;//表示已删除一个节点/////////
  16.                         break;
  17.                     }
  18.                 }
  19.             }
  20.             if(sign==1){
  21.                 sign = 0;//////////
  22.                 break;
  23.             }
  24.         }
  25.         if (sign == 0) {
  26.             prior=prior -> next;//查找下一个节点////////prior->data=13
  27.             p1=prior -> next;///////p1->data=25。这里跳过了13
  28.         }
  29.     }
  30. }
复制代码
  1. void TriLinkList(LinkList A, LinkList B, LinkList C) {
  2.     LinkList p1 ,p2,p3 ,prior = A;
  3.     int sign = 0;
  4.     for(p1 = A->next;p1!=NULL ;){
  5.         for(p2 = B->next ;p2 != NULL ;p2= p2->next){
  6.             if(p2->data==p1->data){//查找B中是否有该元素
  7.                 for(p3 = C->next ; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素

  8.                     if(p3->data==p1->data){
  9.                         prior->next = p1->next;//删除节点操作
  10.                         free(p1);
  11.                         p1=prior -> next;
  12.                         sign = 1;//表示已删除一个节点
  13.                         break;
  14.                     }
  15.                 }
  16.             }
  17.             if(sign==1){
  18.                //////// sign = 0;///////////////////////这里删除
  19.                 break;
  20.             }
  21.         }
  22.         if (sign == 0) {
  23.             prior=prior -> next;//查找下一个节点
  24.             p1=prior -> next;
  25.         }
  26.     }
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-8 23:07:04 | 显示全部楼层
本帖最后由 jhq999 于 2023-3-9 10:02 编辑
  1. void TriLinkList(LinkList A, LinkList B, LinkList C) {
  2.     LinkList p1 ,p2,p3 ,prior = A,b,c;
  3.     int sign = 0;
  4.     for(p1 = A->next,b = B->next,c = C->next;p1!=NULL ;){
  5.         for(p2=b ;p2 != NULL ;p2= p2->next){//////////////////
  6.             if(p2->data==p1->data){//查找B中是否有该元素
  7.                 for( p3=c; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素////////////////

  8.                     if(p3->data==p1->data){
  9.                         prior->next = p1->next;//删除节点操作
  10.                         free(p1);
  11.                         p1=prior -> next;
  12.                         sign = 1;//表示已删除一个节点
  13.                         b=p2;/////////////
  14.                         c=p3;////////////因为顺序表的原因表B表C不用从开头搜索,例如13搜索完成后,3个表在13的位置前面没有比13大的了所以没有必要收前面
  15.                         break;
  16.                     }
  17.                 }
  18.             }
  19.             if(sign==1){
  20.                 break;
  21.             }
  22.         }
  23.         if (sign == 0) {
  24.             prior=prior -> next;//查找下一个节点
  25.             p1=prior -> next;
  26.         }
  27.     }
  28. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 20:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表