Klutz711 发表于 2023-3-8 20:47:22

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

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

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

                  if(p3->data==p1->data){
                        prior->next = p1->next;//删除节点操作
                        free(p1);
                        p1=prior -> next;
                        sign = 1;//表示已删除一个节点
                        break;
                  }
                }
            }
            if(sign==1){
                sign = 0;
                break;
            }
      }
      if (sign == 0) {
            prior=prior -> next;//查找下一个节点
            p1=prior -> next;
      }
    }
}


测试出现错误的数据:
输入:
1113252729303642500
39101113 30 42 0
3679 111342 500
预期输出:
25 27 29 30 36 50
实际输出:
13 25 27 29 30 36 50

实在不知道是哪里的问题,求指点!感谢!

jhq999 发表于 2023-3-8 22:51:22

本帖最后由 jhq999 于 2023-3-8 22:54 编辑

/*1113252729303642500
39101113 30 42 0
3679 111342 500*/
void TriLinkList(LinkList A, LinkList B, LinkList C) {
    LinkList p1 ,p2,p3 ,prior = A;
    int sign = 0;
    for(p1 = A->next;p1!=NULL ;){/////////////////////////p1->data=11
      for(p2 = B->next ;p2 != NULL ;p2= p2->next){
            if(p2->data==p1->data){//查找B中是否有该元素
                for(p3 = C->next ; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素

                  if(p3->data==p1->data){
                        prior->next = p1->next;//删除节点操作////////// prior->next->data=13
                        free(p1);
                        p1=prior -> next;///////////////p1->data=13
                        sign = 1;//表示已删除一个节点/////////
                        break;
                  }
                }
            }
            if(sign==1){
                sign = 0;//////////
                break;
            }
      }
      if (sign == 0) {
            prior=prior -> next;//查找下一个节点////////prior->data=13
            p1=prior -> next;///////p1->data=25。这里跳过了13
      }
    }
}

void TriLinkList(LinkList A, LinkList B, LinkList C) {
    LinkList p1 ,p2,p3 ,prior = A;
    int sign = 0;
    for(p1 = A->next;p1!=NULL ;){
      for(p2 = B->next ;p2 != NULL ;p2= p2->next){
            if(p2->data==p1->data){//查找B中是否有该元素
                for(p3 = C->next ; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素

                  if(p3->data==p1->data){
                        prior->next = p1->next;//删除节点操作
                        free(p1);
                        p1=prior -> next;
                        sign = 1;//表示已删除一个节点
                        break;
                  }
                }
            }
            if(sign==1){
               //////// sign = 0;///////////////////////这里删除
                break;
            }
      }
      if (sign == 0) {
            prior=prior -> next;//查找下一个节点
            p1=prior -> next;
      }
    }
}

jhq999 发表于 2023-3-8 23:07:04

本帖最后由 jhq999 于 2023-3-9 10:02 编辑

void TriLinkList(LinkList A, LinkList B, LinkList C) {
    LinkList p1 ,p2,p3 ,prior = A,b,c;
    int sign = 0;
    for(p1 = A->next,b = B->next,c = C->next;p1!=NULL ;){
      for(p2=b ;p2 != NULL ;p2= p2->next){//////////////////
            if(p2->data==p1->data){//查找B中是否有该元素
                for( p3=c; p3!=NULL ;p3 =p3->next){//查找C中是否有该元素////////////////

                  if(p3->data==p1->data){
                        prior->next = p1->next;//删除节点操作
                        free(p1);
                        p1=prior -> next;
                        sign = 1;//表示已删除一个节点
                        b=p2;/////////////
                        c=p3;////////////因为顺序表的原因表B表C不用从开头搜索,例如13搜索完成后,3个表在13的位置前面没有比13大的了所以没有必要收前面
                        break;
                  }
                }
            }
            if(sign==1){
                break;
            }
      }
      if (sign == 0) {
            prior=prior -> next;//查找下一个节点
            p1=prior -> next;
      }
    }
}
页: [1]
查看完整版本: 多单链表删除操作遇到问题