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

****

img


我的代码:

img

img

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

第一个问题是,输入的时候只调用了一次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

修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node* PtrToNode;
struct Node {         //定义结点
    ElementType data;//结点数据域
    PtrToNode   Next;//结点指针域
};
typedef PtrToNode List;

void creatList(List* L)
{
    ElementType x;
    PtrToNode pt = NULL, pL = NULL ;
    while (1){
        scanf("%d", &x);
        if (x == -1)  break;
        pt = (List)malloc(sizeof(struct Node));
        pt->Next = NULL;
        pt->data = x;
        if (!(*L))
            (*L) = pt;
        else
            pL->Next = pt;
        pL = pt;
    }
}
void MergeList_L(List* L1, List* L2, List* L3)
{
    List  p1 = (*L1),  p2 = (*L2), p3 = (*L3);
    while (p1 && p2) {
        if (p1->data<= p2->data)
        {
            if (!(*L3))
                (*L3) = p1;
            else
                p3->Next = p1;
            p3 = p1;
            p1 = p1->Next;
        }
        else
        {
            if (!(*L3))
                (*L3) = p2;
            else
                p3->Next = p2;
            p3 = p2;
            p2 = p2->Next;
        }
    }
    if (!(*L3))
        (*L3) = p1 ? p1 : p2;
    else
        p3->Next = p1 ? p1 : p2;
    (*L1) = NULL;
    (*L2) = NULL;
}
 
void PrintList(List L)
{
    if (!L)
        printf("NULL");
    else{
        List p = L;
        while (p)
        {
            printf(p == L ? "%d" : " %d", p->data);
            p = p->Next;
        }
    }
}
int main()
{
    List La = NULL, Lb = NULL, Lc = NULL;
    creatList(&La);
    creatList(&Lb);
    MergeList_L(&La, &Lb, &Lc);
    PrintList(Lc);

    return 0;
}

放到编译器上报错了吗,如果报错了,把报错警告发出来