鱼C论坛

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

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

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

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

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

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

我的代码:
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; 
        } 
    }
}

测试出现错误的数据:
输入:
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

实在不知道是哪里的问题,求指点!感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-8 22:51:22 | 显示全部楼层
本帖最后由 jhq999 于 2023-3-8 22:54 编辑
/*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*/
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; 
        } 
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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; 
        } 
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 21:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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