鱼C论坛

 找回密码
 立即注册
查看: 3177|回复: 15

[已解决]关于合并链表中不重复的元素

[复制链接]
发表于 2018-3-28 10:09:10 | 显示全部楼层 |阅读模式

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

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

x
我不懂为什么我的代码出错了
错在哪里了 (合并的那部分哦~)


# include<stdio.h>
# include<stdlib.h>


typedef struct Node
{
        int data;
        struct Node *next;
}Node,*linklist;

int initlist(linklist *L)  //函数会改变L的值 所以要用linklist *L。
{
        *L=(linklist)malloc(sizeof(Node));
        if((*L)==NULL)
        {
                printf("无法分配空间,初始化失败。");
                return -1;
        }
        (*L)->next=NULL;
        printf("初始化成功\n");
        return 0;
}

int creatlist(linklist *L)  //尾插法
{
        int i,n;
        linklist p;
        linklist r=*L; //指向尾节点

        printf("请问您想输入几个元素:");
        scanf("%d",&n);

        for(i=0;i<n;i++)
        {
                p=(linklist)malloc(sizeof(Node));
                if(p==NULL)
                {
                        printf("空间分配失败,程序结束。");
                        return -1;
                }
                printf("请输入第%d个元素",i+1);
                scanf("%d",&p->data);
                p->next=NULL;
                r->next=p;
                r=p;
        }
        return 0;
}

/* int unionlist(linklist *L1,linklist *L2)
{
        int a,b;
       
        linklist p1,p2,ptail=(*L1)->next;
        while(ptail)   //一直循环直至ptail指向L1的尾节点。
        {
                ptail=ptail->next;
        }

        for(p2=(*L2)->next;p2!=NULL;p2=p2->next)
        {
                a=p2->data;
                for(p1=(*L1)->next;p1!=NULL;p1=p1->next)
                {
                        b=p1->data;
                        if(a=b)
                                break;
                }
                if(a!=b)
                {
                        linklist p=(linklist)malloc(sizeof(Node));
                        p->data=a;
                        p->next=NULL;
                        ptail->next=p;
                        ptail=p;
                }
        }
        return 0;
} */
int unionlist(linklist L1,linklist L2)
{
        int a,b;
        int count=1;
       
        linklist p1,p2,ptail=L1;
        while(ptail->next)   //一直循环直至ptail指向L1的尾节点。
        {
                ptail=ptail->next;
        }

        for(p2=L2->next;(p2->next)!=NULL;p2=p2->next)
        {
                for(p1=L1->next;(p1->next)!=NULL;p1=p1->next)
                {
                        if(p2->data==p1->data)
                        {
                                count=0;
                                break;
                        }
                }
                if(count=1)
                {
                        linklist p=(linklist)malloc(sizeof(Node));
                        p->data=p2->data;
                        p->next=NULL;
                        ptail->next=p;
                        ptail=p;
                }
        }
        return 0;
}






void seelist(linklist L)
{
        linklist p=NULL;
        p=L->next;

        while(p)
        {
                printf("%d  ",p->data);
                p=p->next;
        }
        printf("\n");
}







int main()
{
       
        linklist L1,L2;
        initlist(&L1);
        printf("请创建第一个表:");
        creatlist(&L1);

       
        initlist(&L2);
        printf("请创建第二个表:");
        creatlist(&L2);

        unionlist(L1,L2);
        printf("合并之后的顺序表为:");
        seelist(L1);
        return 0;
}
最佳答案
2018-3-28 22:52:58
愿你 发表于 2018-3-28 22:37
好吧 我又错了  两层for循环条件不一样,所以没有办法判断L1的最后一个元素,所以你要再加上一个if语句来 ...

是的 flag == 1
QQ图片20180325190330.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-28 10:27:08 | 显示全部楼层
之前那贴我好像有答吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-28 10:41:56 | 显示全部楼层
ba21 发表于 2018-3-28 10:27
之前那贴我好像有答吧

但是我还是不懂我这个为啥错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-28 13:22:41 | 显示全部楼层
本帖最后由 ba21 于 2018-3-28 22:53 编辑
int unionlist(linklist L1,linklist L2)
{
        int flag;
        
        linklist p,p1,p2,ptail=L1;
                /*
        while(ptail->next)   //p1的尾结点随时在变,这里有毛用
        {
                ptail=ptail->next;
        }
                */

        for(p2=L2->next;p2!=NULL;p2=p2->next)
        {
                                flag = 1; // 每次更该标记
                for(p1=L1->next;(p1->next)!=NULL;p1=p1->next)
                {
                        if(p2->data==p1->data)
                        {
                                flag=0;
                                break;
                        }
                }
                                // 比较p1最后一个元素
                                if(p1->next==NULL && flag==1)
                                {
                                   if(p2->data==p1->data)
                   {
                                flag=0;
                  }        
                                }
                if(flag==1) //==
                {
                        p=(linklist)malloc(sizeof(Node));
                        p->data=p2->data;
                        p->next=NULL;
                        p1->next=p;
                }
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-28 21:14:38 | 显示全部楼层
我while循环就是为了让它一开始就指向L1的尾节点啊 然后直接方便插入元素。


还有为什么你两层for循环的循环条件不一样,我的循环条件都是判断p->next是不是为空,这样的话就可以循环到尾节点才结束循环不是吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-28 21:15:24 | 显示全部楼层

我while循环就是为了让它一开始就指向L1的尾节点啊 然后直接方便插入元素。


还有为什么你两层for循环的循环条件不一样,我的循环条件都是判断p->next是不是为空,这样的话就可以循环到尾节点才结束循环不是吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-28 21:24:56 | 显示全部楼层
本帖最后由 ba21 于 2018-3-28 22:53 编辑
愿你 发表于 2018-3-28 21:15
我while循环就是为了让它一开始就指向L1的尾节点啊 然后直接方便插入元素。


/p1的尾结点随时在变,这里有毛用

那就这样吧:
int unionlist(linklist L1,linklist L2)
{
        int flag;
        
        linklist p,p1,p2,ptail=L1;
           
        while(ptail->next)  
        {
                ptail=ptail->next;
        }


        for(p2=L2->next;p2!=NULL;p2=p2->next)
        {
               flag = 1; // 每次更该标记
                for(p1=L1->next;(p1->next)!=NULL;p1=p1->next)
                {
                        if(p2->data==p1->data)
                        {
                                flag=0;
                                break;
                        }
                }
                                // 比较p1最后一个元素
                if(p1->next==NULL && flag==1)
                 {
                    if(p2->data==p1->data)
                    {
                                flag=0;
                                        }        
                 }
                if(flag==1) //==
                {
                        p=(linklist)malloc(sizeof(Node));
                        p->data=p2->data;
                        p->next=NULL;

                                                ptail->next=p;
                        ptail=p;
                }
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-28 21:24:56 | 显示全部楼层

我发的那个代码运行成功了 !!!!!!  我只是把那个showlist的参数变成传地址(&L1),然后就打印出来了!!!!!!!!!虽然我没咋看懂你的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-28 21:26:33 | 显示全部楼层

好吧 事实证明....我是瞎猫碰上死耗子
后面又不可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-28 21:27:40 | 显示全部楼层
ba21 发表于 2018-3-28 21:24
/p1的尾结点随时在变,这里有毛用

我插入一个元素他才变到下一个啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-28 21:33:03 | 显示全部楼层
愿你 发表于 2018-3-28 21:27
我插入一个元素他才变到下一个啊

认真看代码,认真看注释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-28 21:59:21 | 显示全部楼层
ba21 发表于 2018-3-28 21:33
认真看代码,认真看注释

脑细胞死太多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-28 22:04:47 | 显示全部楼层
ba21 发表于 2018-3-28 21:24
/p1的尾结点随时在变,这里有毛用

那就这样吧:

我这次的代码真的能运行了!!!!
但是我对于这两种循环的条件好懵...
总感觉其中一种循环是不是会漏掉最后一个数。



int unionlist(linklist L1,linklist L2)
{
        int a,b;
        int count;
       
        linklist p1,p2,ptail=L1;
        while(ptail->next)   //一直循环直至ptail指向L1的尾节点。
        {
                ptail=ptail->next;
        }

        for(p2=L2->next;p2!=NULL;p2=p2->next)
        {
                count=1;
                for(p1=L1->next;(p1->next)!=NULL;p1=p1->next)
                {
                        if(p2->data==p1->data)
                        {
                                count=0;
                                break;
                        }
                }
                if(count==1)
                {
                        linklist p=(linklist)malloc(sizeof(Node));
                        p->data=p2->data;
                        p->next=NULL;
                        ptail->next=p;
                        ptail=p;
                }
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-28 22:37:16 | 显示全部楼层
ba21 发表于 2018-3-28 21:33
认真看代码,认真看注释

好吧 我又错了  两层for循环条件不一样,所以没有办法判断L1的最后一个元素,所以你要再加上一个if语句来判断L1中的最后一个元素。
但是你的判断条件错了吧 应该是if(p1->next&&flag==1);这样才对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-28 22:52:47 | 显示全部楼层
是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-28 22:52:58 | 显示全部楼层    本楼为最佳答案   
愿你 发表于 2018-3-28 22:37
好吧 我又错了  两层for循环条件不一样,所以没有办法判断L1的最后一个元素,所以你要再加上一个if语句来 ...

是的 flag == 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 21:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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