关于合并链表中不重复的元素
我不懂为什么我的代码出错了错在哪里了 (合并的那部分哦~)
# 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
之前那贴我好像有答吧
但是我还是不懂我这个为啥错{:10_243:} 本帖最后由 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;
}
我while循环就是为了让它一开始就指向L1的尾节点啊 然后直接方便插入元素。
还有为什么你两层for循环的循环条件不一样,我的循环条件都是判断p->next是不是为空,这样的话就可以循环到尾节点才结束循环不是吗{:10_245:}{:10_245:} ba21 发表于 2018-3-28 13:22
我while循环就是为了让它一开始就指向L1的尾节点啊 然后直接方便插入元素。
还有为什么你两层for循环的循环条件不一样,我的循环条件都是判断p->next是不是为空,这样的话就可以循环到尾节点才结束循环不是吗{:10_245:}{:10_245:} 本帖最后由 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;
}
ba21 发表于 2018-3-28 13:22
我发的那个代码运行成功了 !!!!!!我只是把那个showlist的参数变成传地址(&L1),然后就打印出来了!!!!!!!!!{:10_250:}{:10_250:}{:10_297:}虽然我没咋看懂你的代码{:10_249:} ba21 发表于 2018-3-28 13:22
好吧 事实证明....我是瞎猫碰上死耗子
后面又不可以了{:10_285:} ba21 发表于 2018-3-28 21:24
/p1的尾结点随时在变,这里有毛用
我插入一个元素他才变到下一个啊 愿你 发表于 2018-3-28 21:27
我插入一个元素他才变到下一个啊
认真看代码,认真看注释 ba21 发表于 2018-3-28 21:33
认真看代码,认真看注释
{:10_266:}{:10_266:}{:10_266:}脑细胞死太多了 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;
} ba21 发表于 2018-3-28 21:33
认真看代码,认真看注释
好吧 我又错了两层for循环条件不一样,所以没有办法判断L1的最后一个元素,所以你要再加上一个if语句来判断L1中的最后一个元素。
但是你的判断条件错了吧 应该是if(p1->next&&flag==1);这样才对吧 是的 愿你 发表于 2018-3-28 22:37
好吧 我又错了两层for循环条件不一样,所以没有办法判断L1的最后一个元素,所以你要再加上一个if语句来 ...
是的 flag == 1
页:
[1]