用链表实现两个有序数组的输入和排序

有可能是因为创建链表部分不对,希望大师支招
以下是代码:
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int info;
struct Node *next;
};
typedef struct Node *PNode;//定义结点类型指针
struct Linklist
{
PNode head;
};
typedef struct Linklist Linklist,*PLinklist;//定义链表结构及其指针
PLinklist createNullList(int n)//创建一个新的链表
{
int i;
PLinklist pllist;
PNode p,q;
pllist=(PLinklist)malloc(sizeof(PLinklist));
p=pllist->head;
p->next=NULL;
for(i=0;i<n;i++)
{
q=(PNode)malloc(sizeof(PNode));//用于指向下一个位置
q=p->next;
scanf("%d",&q->info);//给链表赋值
p=q;
}
p->next=NULL;//输入完毕
free(q);//释放
return pllist;
}
void merge(PNode pa,PNode pb,PLinklist lc)//排序
{
PNode pc;
lc->head=pc=pa;
pa=pa->next;
pb=pb->next;
while(pa&&pb)
{
if(pa->info<=pb->info)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pa=pb->next;
}
}
pc->next=pa?pa:pb;//较长链表的剩余部分直接接入
}
int main()//主函数部分
{
int n,m;
PLinklist la,lb,lc;//用于排序的两个链表la,lb,用于合并的链表lc
PNode pa,pb;
scanf("%d\n",&n);
la=createNullList(n);
pa=la->head;
scanf("%d\n",&m);
lb=createNullList(m);
pb=lb->head;
merge(pa,pb,lc);
PNode temp;//用于输出的结点
for(temp=lc->head;temp;temp=temp->next)
{
printf("%d\n",temp->info);
}
free(temp); //释放
return 0;
}
在DEV C++上无法输入第二个数组,
在codeblocks上error:Aborted(program collect2)

添加************************************的地方是我修改的


#include <stdio.h>
#include <stdlib.h>
struct Node
{
    int info;
    struct Node* next;
};
typedef struct Node* PNode;//定义结点类型指针
struct Linklist
{
    PNode head;
};
typedef struct Linklist Linklist, * PLinklist;//定义链表结构及其指针
PLinklist createNullList(int n)//创建一个新的链表
{
    if (n < 1){
        return nullptr;
    }
    int i;
    PLinklist pllist;
    PNode p = nullptr, q = nullptr;//初始化一下p和q的值************************************
    pllist = (PLinklist)malloc(sizeof(PLinklist));
    pllist->head = (PNode)malloc(sizeof(PNode));//申请header************************************
    p = pllist->head;    
    p->next = NULL;
    for (i = 0; i < n; i++)
    {
        q = (PNode)malloc(sizeof(PNode));//用于指向下一个位置
        p->next = q;//赋值方向反了************************************
        scanf("%d", &q->info);//给链表赋值
        p = q;
    }
    p->next = NULL;//输入完毕
    //free(q);//这里没有必要释放,因为你申请的内存都已经存储到链表中了************************************
    return pllist;
}
void merge(PNode pa, PNode pb, PLinklist lc)//排序
{
    PNode pc;
    lc->head = pc = pa;
    pa = pa->next;
    pb = pb->next;
    while (pa && pb)
    {
        if (pa->info <= pb->info)
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else
        {
            pc->next = pb;
            pc = pb;
            pa = pb->next;
        }
    }
    pc->next = pa ? pa : pb;//较长链表的剩余部分直接接入
}
int main()//主函数部分
{
    int n, m;
    PLinklist la, lb, lc;//用于排序的两个链表la,lb,用于合并的链表lc
    lc = (PLinklist)malloc(sizeof(PLinklist));//构建lc ************************************
    lc->head = nullptr;//************************************
    PNode pa, pb;
    scanf("%d\n", &n);
    la = createNullList(n);
    pa = la->head;
    scanf("%d\n", &m);
    lb = createNullList(m);
    pb = lb->head;
    merge(pa, pb, lc);
    PNode temp;//用于输出的结点
    for (temp = lc->head; temp; temp = temp->next)
    {
        printf("%d\n", temp->info);
    }
    //free(temp); //释放,这里不用释放,因为不是你申请的,否则lc就会被破坏了************************************
    //需要释放一下lc的内存************************************
    return 0;
}

img

至少这是一个错误,不知道还有没有其他错误。

修改处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
typedef struct _Node
{
    int    info;
    struct _Node* next;
}*PNode, Node, Linklist, * PLinklist; //修改
//typedef struct Node* PNode;//定义结点类型指针
//struct Linklist
//{
//    PNode head;
//};
//typedef struct Linklist Linklist, * PLinklist;//定义链表结构及其指针
PLinklist createNullList(int n)//创建一个新的链表
{
    int i;
    PLinklist pllist;
    PNode p, q;
    pllist = (PLinklist)malloc(sizeof(Linklist));
    //pllist = (PLinklist)malloc(sizeof(PLinklist)); 修改
    p = pllist;          //修改
    p->next = NULL;
    for (i = 0; i < n; i++)
    {
        q = (PNode)malloc(sizeof(Node));//用于指向下一个位置
        //q = (PNode)malloc(sizeof(PNode));
        q->next = NULL;//修改
        p->next = q;
        //q = p->next; //修改
        scanf("%d", &q->info);//给链表赋值
        p = q;
    }
    //p->next = NULL;//输入完毕
    //free(q);//释放
    return pllist;
}
void merge(PNode pa, PNode pb, PLinklist* lc)//排序 修改
{
    PNode pc, ppb = pb; //修改
    (*lc) = pc = pa;     //修改
    pa = pa->next;
    ppb = ppb->next;    //修改
    while (pa && ppb)  //修改
    {
        if (pa->info <= ppb->info)  //修改
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else
        {
            pc->next = ppb;   //修改
            pc = ppb;         //修改
            ppb = ppb->next;  //pa = pb->next;  修改
        }
    }
    pc->next = pa ? pa : ppb;//较长链表的剩余部分直接接入
    free(pb); //释放链表 b 的头结点
}
int main()//主函数部分
{
    int n, m;
    PLinklist la, lb, lc;//用于排序的两个链表la,lb,用于合并的链表lc
    PNode pa, pb;
    scanf("%d\n", &n);
    la = createNullList(n);
    pa = la;    //修改
    scanf("%d\n", &m);
    lb = createNullList(m);
    pb = lb;    //修改
    merge(pa, pb, &lc);  //修改
    PNode temp;//用于输出的结点
    for (temp = lc->next; temp; temp = temp->next)   //修改
    {
        printf("%d ", temp->info);
    }
    free(temp); //释放
    return 0;
}