鱼C论坛

 找回密码
 立即注册
查看: 2749|回复: 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 编辑
  1. int unionlist(linklist L1,linklist L2)
  2. {
  3.         int flag;
  4.         
  5.         linklist p,p1,p2,ptail=L1;
  6.                 /*
  7.         while(ptail->next)   //p1的尾结点随时在变,这里有毛用
  8.         {
  9.                 ptail=ptail->next;
  10.         }
  11.                 */

  12.         for(p2=L2->next;p2!=NULL;p2=p2->next)
  13.         {
  14.                                 flag = 1; // 每次更该标记
  15.                 for(p1=L1->next;(p1->next)!=NULL;p1=p1->next)
  16.                 {
  17.                         if(p2->data==p1->data)
  18.                         {
  19.                                 flag=0;
  20.                                 break;
  21.                         }
  22.                 }
  23.                                 // 比较p1最后一个元素
  24.                                 if(p1->next==NULL && flag==1)
  25.                                 {
  26.                                    if(p2->data==p1->data)
  27.                    {
  28.                                 flag=0;
  29.                   }       
  30.                                 }
  31.                 if(flag==1) //==
  32.                 {
  33.                         p=(linklist)malloc(sizeof(Node));
  34.                         p->data=p2->data;
  35.                         p->next=NULL;
  36.                         p1->next=p;
  37.                 }
  38.         }
  39.         return 0;
  40. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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的尾结点随时在变,这里有毛用

那就这样吧:
  1. int unionlist(linklist L1,linklist L2)
  2. {
  3.         int flag;
  4.         
  5.         linklist p,p1,p2,ptail=L1;
  6.            
  7.         while(ptail->next)  
  8.         {
  9.                 ptail=ptail->next;
  10.         }


  11.         for(p2=L2->next;p2!=NULL;p2=p2->next)
  12.         {
  13.                flag = 1; // 每次更该标记
  14.                 for(p1=L1->next;(p1->next)!=NULL;p1=p1->next)
  15.                 {
  16.                         if(p2->data==p1->data)
  17.                         {
  18.                                 flag=0;
  19.                                 break;
  20.                         }
  21.                 }
  22.                                 // 比较p1最后一个元素
  23.                 if(p1->next==NULL && flag==1)
  24.                  {
  25.                     if(p2->data==p1->data)
  26.                     {
  27.                                 flag=0;
  28.                                         }        
  29.                  }
  30.                 if(flag==1) //==
  31.                 {
  32.                         p=(linklist)malloc(sizeof(Node));
  33.                         p->data=p2->data;
  34.                         p->next=NULL;

  35.                                                 ptail->next=p;
  36.                         ptail=p;
  37.                 }
  38.         }
  39.         return 0;
  40. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-4-26 11:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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