###### 问题遇到的现象和发生背景
找公共节点,运行结果不显示东西
###### 用代码块功能插入代码,请勿粘贴截图
#include
#include
#include
typedef struct lnode
{
int data;
struct lnode *next;
}lnode,*linklist;
void Create(linklist&l,int n)
{
int i;
l=(linklist)malloc(sizeof(lnode));
l->next=NULL;
lnode*r=l;
lnode*p;
for(i=1;i<=n;i++)
{
lnode*p=(lnode*)malloc(sizeof(lnode));
scanf("%d",&p->data);
p->next=NULL;//注意出现断链的情况,伪代码可以出现,但在写入程序执行时,必须避免断链情况的发生//
r->next=p;
r=p;
}
return ;
}
//求链表的长度
int Len(linklist&l)
{
lnode*p;
int num = 0;
p= l->next;
while (p != NULL)
{
num++;
p = p->next;
}
return num;
}
//寻找两个链表中的公共结点
void searchCommonNode(linklist&l1,linklist&l2)
{
lnode*p,*q;
int len1, len2, dis;
len1 = Len(l1);
len2 = Len(l2);
if (len1 > len2) //链表1的长度大于链表2的长度
{
p = l1->next; //指向长表
q = l2->next; //指向短表
dis = len1 - len2; //两表长度差
}
else
{
p = l2->next;
q = l1->next;
dis = len2 - len1;
}
while (dis--) //长表先遍历到第dis个结点后再和短表同步遍历
{
p = p->next;
}
while (p != NULL) //寻找公共结点
{
if (p == q) //找到第一个相同结点
{
break;
}
else
{
p = p->next;
q = q->next;
}
}
printf("两个链表的公共结点为:\n");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void Print(linklist&l)
{
lnode*p=l->next;
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
}
int main()
{
linklist L1;
linklist L2;
int m,n;
printf("请输入L1结点数:");
scanf("%d",&m);
printf("请依次输入L1元素,中间用空格隔开:\n");
Create(L1,m);
printf("输出L1:");
Print(L1);
printf("请输入L2结点数:");
scanf("%d",&n);
printf("请依次输入L2元素,中间用空格隔开:\n");
Create(L2,n);
printf("输出L2:");
Print(L2);
searchCommonNode(L1,L2);
}
###### 运行结果及报错内容
###### 我的解答思路和尝试过的方法
###### 我想要达到的结果
两个单链表有公共结点,也就是两个链表从某一结点开始,它们的指针域都指向同一个结点。由于每个单链表结点只有一个next域,因此从第一个公共结点开始,之后所有的结点都是重合的。题主的代码缺了链表指针域重合的操作,修改如下,见注释,供参考:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
typedef struct lnode
{
int data;
struct lnode* next;
}lnode, * linklist;
void Create(linklist& l, int n)
{
int i;
l = (linklist)malloc(sizeof(lnode));
l->next = NULL;
lnode* r = l;
lnode* p;
for (i = 1; i <= n; i++)
{
lnode* p = (lnode*)malloc(sizeof(lnode));
scanf("%d", &p->data);
p->next = NULL;//注意出现断链的情况,伪代码可以出现,但在写入程序执行时,必须避免断链情况的发生//
r->next = p;
r = p;
}
return;
}
//求链表的长度
int Len(linklist& l)
{
lnode* p;
int num = 0;
p = l->next;
while (p != NULL)
{
num++;
p = p->next;
}
return num;
}
//寻找两个链表中的公共结点
void searchCommonNode(linklist& l1, linklist& l2)
{
lnode* p, * q;
int len1, len2, dis;
len1 = Len(l1);
len2 = Len(l2);
if (len1 > len2) //链表1的长度大于链表2的长度
{
p = l1->next; //指向长表
q = l2->next; //指向短表
dis = len1 - len2; //两表长度差
}
else
{
p = l2->next;
q = l1->next;
dis = len2 - len1;
}
while (dis--) //长表先遍历到第dis个结点后再和短表同步遍历
{
p = p->next;
}
while (p != NULL) //寻找公共结点
{
if (p == q) //找到第一个相同结点
{
break;
}
else
{
p = p->next;
q = q->next;
}
}
if (!p) {
printf("两个链表无公共结点.\n");
return;
}
printf("两个链表的公共结点为:\n");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void Print(linklist& l)
{
lnode* p = l->next;
while (p != NULL)
{
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
//连接两个链表
linklist link(linklist list1, linklist list2) //修改
{
linklist pmove, qmove;
pmove = list1;
qmove = list2;
while (pmove->next)
{
pmove = pmove->next;
}
pmove->next = qmove->next; //更改list1的指针域,让其指向list2完成连接
return list1;
}
int main()
{
linklist L1;
linklist L2;
linklist L3; // 修改
linklist L13;//链表L1 与 L3 链接后的新链表头 修改
linklist L23;//链表L2 与 L3 链接后的新链表头 修改
int m, n;
printf("请输入L1结点数:");
scanf("%d", &m);
printf("请依次输入L1元素,中间用空格隔开:\n");
Create(L1, m);
printf("输出L1:");
Print(L1);
printf("请输入L2结点数:");
scanf("%d", &n);
printf("请依次输入L2元素,中间用空格隔开:\n");
Create(L2, n);
printf("输出L2:");
Print(L2);
printf("L1 L2:");
searchCommonNode(L1, L2); //寻找L1 和 L2 两链表的公共结点
printf("请输入L3结点数:"); //修改
scanf("%d", &n);
printf("请依次输入L3元素,中间用空格隔开:\n");
Create(L3, n);
printf("输出L3:");
Print(L3);
L13 = link(L1, L3); //修改
printf("链表L1和链表L3连接后为:\n");
Print(L13);
L23 = link(L2, L3); //修改
printf("链表L2和链表L3连接后为:\n");
Print(L23);
searchCommonNode(L13, L23); //寻找L13 和 L23 两链表的公共结点
return 0;
}
if (p == q)
这是在干什么,俩指针地址可能相等吗,你要比较data相等不相等啊
此外,//长表先遍历到第dis个结点后再和短表同步遍历
这又要干什么,虽然你这里输入长度都是5,跟这里没有关系,但是如果你输入的是3,4,5,6,7,8,9,0,不直接把3,4,5跳过去了?