愿你 发表于 2018-3-28 10:09:10

关于合并链表中不重复的元素

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


# 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;
}

ba21 发表于 2018-3-28 10:27:08

之前那贴我好像有答吧

愿你 发表于 2018-3-28 10:41:56

ba21 发表于 2018-3-28 10:27
之前那贴我好像有答吧

但是我还是不懂我这个为啥错{:10_243:}

ba21 发表于 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;
}

愿你 发表于 2018-3-28 21:14:38

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


还有为什么你两层for循环的循环条件不一样,我的循环条件都是判断p->next是不是为空,这样的话就可以循环到尾节点才结束循环不是吗{:10_245:}{:10_245:}

愿你 发表于 2018-3-28 21:15:24

ba21 发表于 2018-3-28 13:22


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


还有为什么你两层for循环的循环条件不一样,我的循环条件都是判断p->next是不是为空,这样的话就可以循环到尾节点才结束循环不是吗{:10_245:}{:10_245:}

ba21 发表于 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;
}

愿你 发表于 2018-3-28 21:24:56

ba21 发表于 2018-3-28 13:22


我发的那个代码运行成功了 !!!!!!我只是把那个showlist的参数变成传地址(&L1),然后就打印出来了!!!!!!!!!{:10_250:}{:10_250:}{:10_297:}虽然我没咋看懂你的代码{:10_249:}

愿你 发表于 2018-3-28 21:26:33

ba21 发表于 2018-3-28 13:22


好吧 事实证明....我是瞎猫碰上死耗子
后面又不可以了{:10_285:}

愿你 发表于 2018-3-28 21:27:40

ba21 发表于 2018-3-28 21:24
/p1的尾结点随时在变,这里有毛用

我插入一个元素他才变到下一个啊

ba21 发表于 2018-3-28 21:33:03

愿你 发表于 2018-3-28 21:27
我插入一个元素他才变到下一个啊

认真看代码,认真看注释

愿你 发表于 2018-3-28 21:59:21

ba21 发表于 2018-3-28 21:33
认真看代码,认真看注释

{:10_266:}{:10_266:}{:10_266:}脑细胞死太多了

愿你 发表于 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;
}

愿你 发表于 2018-3-28 22:37:16

ba21 发表于 2018-3-28 21:33
认真看代码,认真看注释

好吧 我又错了两层for循环条件不一样,所以没有办法判断L1的最后一个元素,所以你要再加上一个if语句来判断L1中的最后一个元素。
但是你的判断条件错了吧 应该是if(p1->next&&flag==1);这样才对吧

ba21 发表于 2018-3-28 22:52:47

是的

ba21 发表于 2018-3-28 22:52:58

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

是的 flag == 1
页: [1]
查看完整版本: 关于合并链表中不重复的元素