Great Big Storm 2022-03-28 00:23 采纳率: 57.1%
浏览 56
已结题

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

有可能是因为创建链表部分不对,希望大师支招
以下是代码:
#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)

  • 写回答

3条回答 默认 最新

  • stone_wangzx 2022-03-28 10:55
    关注

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

    
    #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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 已采纳回答 3月29日
  • 创建了问题 3月28日

悬赏问题

  • ¥15 如何解决蓝牙通话音频突发失真问题
  • ¥15 安装opengauss数据库报错
  • ¥15 【急】在线问答CNC雕刻机的电子电路与编程
  • ¥60 在mc68335芯片上移植ucos ii 的成功工程文件
  • ¥15 笔记本外接显示器正常,但是笔记本屏幕黑屏
  • ¥15 Python pandas
  • ¥15 蓝牙硬件,可以用哪几种方法控制手机点击和滑动
  • ¥15 生物医学数据分析。基础课程就v经常唱课程舅成牛逼
  • ¥15 云环境云开发云函数对接微信商户中的分账功能
  • ¥15 空间转录组CRAD遇到问题