赶快来找岔。求两个带头结点的单链表的交集

yuhooks 2008-12-10 11:17:45
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct node{
datatype data;
struct node *next;
}linknode;
typedef linknode *linklist;

linklist creat(void)
{
linklist r,head,s;
int x;
head=r=(linklist)malloc(sizeof(linknode));/*一开始,head和r都指向头结点*/
head->next=NULL;
scanf("%d",&x);
while(x)
{
s=(linklist)malloc(sizeof(linknode));
s->data=x;/*将x值赋予s*/
r->next=s;
r=s;/*r始终指向最后一个结点*/
scanf("%d",&x);
}
r->next=NULL;
return head;
}
void print(linklist head)
{
linklist p;
p=head->next;
printf("list is:\n");
while(p)
{
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
void inter(linklist a,linklist b,linklist c)/*求两个单链表的交集*/
{
linklist s,t,p,q;
p=(linklist)malloc(sizeof(linknode));
p=c->next;
q=s=a->next;
t=b->next;
if(s!=NULL)
{
while(s->next)
{
q=q->next;
while(t && s->data!=t->data)
t=t->next;

p->data=s->data;
p=p->next;
p=(linklist)malloc(sizeof(linknode));

s=q;
}

}
}
void main()
{
linklist x,y,z;
z=(linklist)malloc(sizeof(linknode));
z->next=NULL;
x=creat();
print(x);
y=creat();
print(y);
inter(x,y,z);
print(z);
getch();

}
...全文
338 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuhooks 2008-12-10
  • 打赏
  • 举报
回复
谢谢
Tiger_ldy 2008-12-10
  • 打赏
  • 举报
回复
解题思路:
1.如果他们相交,那么他们的最好一个节点必定是共有的,这样我们只要先遍历第一个链到最后一个节点并且先记住他,而后遍历第二个链到最后一个节点,并将其与第一个链的最后一个节点比较。如果相等则相交;否则不相交
2.那其中一个链的头节点连接到另外一个链的尾节点,如果他们相交,就会形成一个环,这样的话只要判断环是否存在就可以了判断出 这连个链是否相交
  • 打赏
  • 举报
回复
这代码差得也太远了吧,逻辑都很混乱。

void inter(linklist a,linklist b, linklist c)
/*求两个单链表的交集*/
{
linklist s,t,p,q;
s=a->next;
q=c;
while(s)
{
t=b->next;
while(t && s->data!=t->data)
t=t->next;

if(t)
{
p=(linklist)malloc(sizeof(linknode));
p->data=s->data;
p->next=NULL;
q->next=p;
q=q->next; //始终指向最后一个结点
}

s=s->next;
}
}

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧