彗星爱酿酒 2023-03-26 00:17 采纳率: 60.7%
浏览 68
已结题

关于两个有序链表序列合并的问题(语言-c语言)

****

img


我的代码:

img

img

可以帮忙看一下,有错误看不出来,希望可以解说的简单具体一点

  • 写回答

4条回答 默认 最新

  • ksgpjhqf 2023-03-26 02:38
    关注

    第一个问题是,输入的时候只调用了一次malloc函数,导致第2个数据以及后面的都没有分配内存,出现段错误。
    第二个问题是,没有保存链表的头节点,导致f1=f1->next;后就找不到f1原来指向的内存了,造成内存泄漏。
    第三个问题……这个合并……我直接把我写好的有序链表合并的代码发了吧:

    void lmerge(List *h, List h1, List h2) {//将以h1和h2为头节点的链表合并,注意h、h1和h2不是空头 
        struct Node h3, *p, *q, *t;//这个h3是空头 
        t = &h3;
        for (p = h1, q = h2; p != NULL && q != NULL;) {
            if (p->Data<= q->Data) {
                t->Next = p, t = p, p = p->Next;
            } else {
                t->Next = q, t = q, q = q->Next;
            }
        }
        while (p != NULL) t->Next = p, t = p, p = p->Next;
        while (q != NULL) t->Next = q, t = q, q = q->Next;
        t->Next = NULL;
        *h = h3.Next;
    }
    
    

    第四个问题是,你的链表输出是个死循环,因为没有将f3指向下一个节点,输出的始终是同一个节点的数据。
    修改后的全部代码:

    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct Node {
        int Data;
        struct Node *Next;
    }node,*List;
     
    void lmerge(List *h, List h1, List h2) {//将以h1和h2为头节点的链表合并,注意h、h1和h2不是空头 
        node h3, *p, *q, *t;//这个h3是空头 
        t = &h3;
        for (p = h1, q = h2; p != NULL && q != NULL;) {
            if (p->Data<= q->Data) {
                t->Next = p, t = p, p = p->Next;
            } else {
                t->Next = q, t = q, q = q->Next;
            }
        }
        while (p != NULL) t->Next = p, t = p, p = p->Next;
        while (q != NULL) t->Next = q, t = q, q = q->Next;
        t->Next = NULL;
        *h = h3.Next;
    }
     
    int main() {
        int n;
        List h1,h2,t1,t2;
        t1=h1=(List)malloc(sizeof(node));
        t2=h2=(List)malloc(sizeof(node));
        
        for(scanf("%d",&n);n!=-1;scanf("%d",&n)){
            t1->Next=(List)malloc(sizeof(node));
            t1->Next->Data=n;
            t1=t1->Next;
        }
        t1->Next=NULL;
        t1=h1->Next;
        free(h1);
        h1=t1;
        
        for(scanf("%d",&n);n!=-1;scanf("%d",&n)){
            t2->Next=(List)malloc(sizeof(node));
            t2->Next->Data=n;
            t2=t2->Next;
        }
        t2->Next=NULL;
        t2=h2->Next;
        free(h2);
        h2=t2;
        
        lmerge(&h1,h1,h2);
        if(h1==NULL)printf("NULL");
        for(t1=h1;t1!=NULL;t1=t1->Next){
            printf("%d ",t1->Data);
        }
        return 0;
    }
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?