动态链表调试,总是显示(.text+0xdc): undefined reference to `p2'还有[Error] ld returned 1 exit status

各位帮我看看我这怎么调试啊


#include<stdio.h>
#include<malloc.h>
struct element{
    char a;
    struct element *next;
};
struct element *linked(int n)
{
    struct element *head;
    struct element *p1,*p2;
    char b;
    int i;
    scanf("%c",&b);
    for(i=0;i<n;i++)
    {
        p1=p2=(struct element*)malloc(sizeof(struct element));
        p1->a=b;
        p1->next=NULL;
        if(head==NULL)
        head=p1;
        else
        p2->next=p1;
        p2=p1;
        scanf("%c",&b); 
    }
    return head;
}
int main(void)
{
    struct element *head1,*head2,*p,*p3;
    extern struct element *p1,*p2;
    int n,m;
    scanf("%d",&n);
    head1=linked(n);
    p3=p2;
    scanf("%d",&m);
    head2=linked(m);
    p3->next=head2;
    p=head1;
    while(p->next!=NULL)
    {
        printf("%c ",p->a);
    }
    return 0;
}

extern struct element *p1,*p2;
你要干嘛?

#include<stdio.h>
#include<malloc.h>

struct element{
    char a;
    struct element *next;
};

struct element *linked(int n)
{
    struct element *head = NULL; // 初始化为空
    struct element *p1 = NULL, *p2 = NULL;
    char b;
    int i;
    for(i=0;i<n;i++)
    {
        p1 = (struct element*)malloc(sizeof(struct element));
        p1->a = b;
        p1->next = NULL;
        scanf("%c",&b);
        if(head==NULL) {
            head = p1;
        }
        else {
            p2->next=p1;
        }
        p2=p1;
    }
    return head;
}

int main(void)
{
    struct element *head1, *head2, *p, *p3;
    int n,m;
    scanf("%d",&n);
    if(n <= 0) { // 当节点数小于等于 0 时,直接退出
        return 0;
    }
    head1 = linked(n);
    p3 = p2;
    scanf("%d",&m);
    if(m <= 0) { // 当节点数小于等于 0 时,直接退出
        return 0;
    }
    head2 = linked(m);
    p3->next = head2;
    p = head1;
    while(p != NULL) { // 打印链表需要依次遍历
        printf("%c ",p->a);
        p = p->next;
    }
    return 0;
}

修改如下,改动处见注释,供参考:

#include<stdio.h>
#include<malloc.h>
struct element{
    char a;
    struct element *next;
};
struct element *linked(int n)
{
    struct element *head=NULL; // 修改
    struct element *p1,*p2;
    char b;
    int i;
              //scanf(" %c",&b);修改
    for(i=0;i<n;i++)
    {
        scanf(" %c",&b); //修改
        p1=(struct element*)malloc(sizeof(struct element)); //修改
        //p1=p2=(struct element*)malloc(sizeof(struct element));
        p1->a=b;
        p1->next=NULL;
        if(head==NULL)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
    }
    return head;
}
int main(void)
{
    struct element *head1,*head2,*p,*p3;
                  //extern struct element *p1,*p2; 修改
    int n,m;
    scanf("%d",&n);
    head1=linked(n);
                 //p3=p2; 修改
    scanf("%d",&m);
    head2=linked(m);
                 //p3->next=head2;修改
    p=head1;
    while(p!=NULL) //while(p->next!=NULL)修改
    {
        printf("%c ",p->a);
        p = p->next; // 修改
    }
    return 0;
}