c语言 合并链表代码出错

两个有序链表合并为一个升序链表,函数是正确的,但用code block运行结果出错,请大家帮忙看看是不是mian里哪里有问题呢?


struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode*hebing(struct ListNode*list1,struct ListNode*list2)
{
    struct ListNode*a,*b;
    a=(struct ListNode*)malloc(sizeof(struct ListNode));
      b=a;
    while(list1&&list2)
    {
        if(list1->val->val)
        {
            b->next=list1;
            b=list1;
            list1=list1->next;
        }
        else
        {
            b->next=list2;
            b=list2;
            list2=list2->next;
        }
    }
    if(list1)
        b->next=list1;
    else

        b->next=list2;

    return a->next;

}

void printOut(struct ListNode *L) {
    struct ListNode *p = L->next;
    while (p) {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

void create(struct ListNode *L, int X) {
    struct ListNode *t = (struct ListNode *)malloc(sizeof(struct ListNode));
    t->val = X;
    t->next = L->next;
    L->next = t;
}

int main()
{
    struct ListNode*list1,*list2,*he;
    list1=(struct ListNode*)malloc(sizeof(struct ListNode));
    list2=(struct ListNode*)malloc(sizeof(struct ListNode));
    he=(struct ListNode*)malloc(sizeof(struct ListNode));
    he->next=NULL;
    list1->next = NULL;
list2->next = NULL;
    int a[] = {1,2,4};
    int b[]={1,3,4};
    int k;
    for (k = 0; k < 3; k++)
        create(list1, a[2- k]);
    printOut(list1);
     for (k = 0; k < 3; k++)
        create(list2, b[2- k]);
    printOut(list2);
    printOut(hebing(list1,list2));
}

错误结果如图:

img

修改处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
struct ListNode {
    int val;
    struct ListNode *next;
};
struct ListNode*hebing(struct ListNode*list1,struct ListNode*list2)
{
    struct ListNode*a,*b;
    a=(struct ListNode*)malloc(sizeof(struct ListNode));
    b=a;
    list1 = list1->next;  //修改
    list2 = list2->next;  //修改
    while(list1&&list2)
    {
        if(list1->val<list2->val)
        {
            b->next=list1;
            b=list1;
            list1=list1->next;
        }
        else
        {
            b->next=list2;
            b=list2;
            list2=list2->next;
        }
    }
    if(list1)
        b->next=list1;
    else
        b->next=list2;
    return a;  //a->next; 修改
}
void printOut(struct ListNode *L) {
    struct ListNode *p = L->next;
    while (p) {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}
void create(struct ListNode *L, int X) {
    struct ListNode *t = (struct ListNode *)malloc(sizeof(struct ListNode));
    t->val = X;
    t->next = L->next;
    L->next = t;
}
int main()
{
    struct ListNode*list1,*list2,*he;
    list1=(struct ListNode*)malloc(sizeof(struct ListNode));
    list2=(struct ListNode*)malloc(sizeof(struct ListNode));
    he=(struct ListNode*)malloc(sizeof(struct ListNode));
    he->next=NULL;
    list1->next = NULL;
    list2->next = NULL;
    int a[] = {1,2,4};
    int b[]={1,3,4};
    int k;
    for (k = 0; k < 3; k++)
        create(list1, a[2- k]);
    printOut(list1);
    for (k = 0; k < 3; k++)
        create(list2, b[2- k]);
    printOut(list2);
    printOut(hebing(list1,list2));
    return 0;
}

你的代码中,a 和 b 都是指向动态分配的内存空间的指针,但是最后并没有释放这些内存空间。

这可能是导致出错的原因之一,你可以在函数执行完毕后释放 a 和 b 所指向的内存空间。

struct ListNode*hebing(struct ListNode*list1,struct ListNode*list2)
{
    struct ListNode*a,*b;
    a=(struct ListNode*)malloc(sizeof(struct ListNode));
      b=a;
    while(list1&&list2)
    {
        if(list1->val<list2->val)
        {
            b->next=list1;
            b=list1;
            list1=list1->next;
        }
        else
        {
            b->next=list2;
            b=list2;
            list2=list2->next;
        }
    }
    if(list1)
      b->next=list1;
    else
      b->next=list2;

struct ListNode *res = a->next;
free(a);
return res;
}