没运行结果是怎么回事

 ###### 问题遇到的现象和发生背景
找公共节点,运行结果不显示东西
 ###### 用代码块功能插入代码,请勿粘贴截图

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

 ###### 运行结果及报错内容

img

 ###### 我的解答思路和尝试过的方法

 ###### 我想要达到的结果

两个单链表有公共结点,也就是两个链表从某一结点开始,它们的指针域都指向同一个结点。由于每个单链表结点只有一个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跳过去了?