QQ u don't learn le 2018-03-09 15:09 采纳率: 66.7%
浏览 1567
已采纳

c语言数据结构链表空指针问题

这是一个在LeetCode上面的问题,就是把两个已经排序的链表合成一个也是排序的链表,如{1,2,3},{2,3,5}变为{1,2,2,3,3,5};

在指针传入mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 函数之前,就对其进行验证,看其是否为空指针在指针传入mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 函数之前,就对其进行验证,看其是否为空指针
结果说明不是空指针
结果说明不是
但是最后结果却说l2是一个空指针,想不通但是最后结果让人很无奈

结果
图片说明
附上源代码

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct ListNode {
    int val;
    struct ListNode *next;
};
void Print(struct ListNode* l);
struct ListNode* CreateList(int a[]);
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2);
int main() {
    int a[] = { 1,2,3,4 };
    int b[] = { 1,2,3,4,5 };
    struct ListNode* ptr1 = CreateList(a);
    struct ListNode* ptr2 = CreateList(b);
    if (ptr2 == NULL)
        printf("a null");
    printf("not a null\n");
    printf("%d", ptr2->val);
    printf("%d", ptr2->next->val);
    printf("%d", ptr2->next->next->val);
    printf("%d", ptr2->next->next->next->val);
    struct ListNode* ptr3 = mergeTwoLists(ptr1, ptr2);
    //printf("%d", ptr3->val);
    //printf("%d", ptr3->next->val);
    //printf("%d", ptr3->next->next->val);
    //printf("%d", ptr3->next->next->next->val);
    system("pause");
}

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
//将l1 和 l2 合成 l3, 并返回指向l3的指针
{
    if (l1 == NULL&&l2 == NULL) return NULL;

    struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode));
    res->val = 0;
    res->next = NULL;
    struct ListNode* head = res;

    while (l1 != NULL || l2 != NULL)
    {
        if (l1 == NULL) 
        {
            res->next = l2;
            res = l2;
            l2 = l2->next;
        }
        else if(l2==NULL)
        {
            res->next = l1;
            res = l1;
            l1 = l1->next;
        }

        if (l1->val >= l2->val)
        {
            res->next = l2;
            res = l2;
            l2 = l2->next;
        }
        else
        {
            res->next = l1;
            res = l1;
            l1 = l1->next;

        }
    }
    return head->next;
}
struct ListNode* CreateList(int a[])//用数组a创造一个链表
{
    struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode));
    res->val = 0;
    res->next = NULL;
    struct ListNode* head = res;
    struct ListNode*new;
    int length = sizeof(a);
    //printf("%d", length);
    for (int i = 0; i < length; i++)
    {
        res->val = a[i];
        //printf_s("%d-------", res->val);
        new = (struct ListNode*)malloc(sizeof(struct ListNode));
        new->val = 0;
        new->next = NULL;
        res->next = new;
        res = res->next;

    }
    //printf("%d", head->val);
    //printf("%d", head->next->val);
    //printf("%d", head->next->next->val);
    //printf("%d", head->next->next->next->val);
    return head;
}
  • 写回答

2条回答 默认 最新

  • drEditor 2018-03-09 15:57
    关注

    对 if else语句块的执行理解有误。if语句块执行完毕后,整个if else就执行完了,不会执行完if 语句块再去执行else部分, 试想对下面语句,如果此时:
    l1 == NULL, l2 != NULL, l2->next == NULL,
    if (l1 == NULL)
    {
    res->next = l2;
    res = l2;
    l2 = l2->next;
    }// 此时if else语句整体结束, 此时l1==NULL, l2==NULL
    else if(l2==NULL)
    {
    res->next = l1;
    res = l1;
    l1 = l1->next;
    }

              if (l1->val >= l2->val) //此处试图取NULL指针的值,自然会出错,实际上不同的编译器既可能报告l1为空,也可能报告l2为空,因为该处到底
                                                                                //先求那部分的值规范并没有定义,取决于编译器, 报告l1是nullptr也是可能的
                {
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 一道python难题
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度