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;
}
1

2个回答

对 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也是可能的
            {
0
qq_36888679
QQ u don't learn le 问题完美解决!!!谢谢你啊!爱你!~(原谅一个小白~)
一年多之前 回复

在存储的时候,多注意指针的位置,区分指针和内存地址的关系

1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c语言数据结构链表
链表例子,方便大家学习,c语言中的数据结构,大家可以模仿的学习
C语言数据结构之链表
-------------栈------------先进后出;约定了数据的存储规则;-------------------队列----------------------先进先出;-----------链表------------------------
数据结构之链表(C语言)
#includern#includerntypedef struct nodern int data;rn struct node *next;rnNODE;rn rn void *InitList(NODE *L)rn L=(NODE *)malloc(sizeof(NODE));rn L->next=NULL;rn return 0;rn rnrnrn void *creat(NODE *L)rn int m,i; NODE *q,*p ;rn printf("qing shu ru shu mu:");rn scanf("%d",&m);rn printf("qing shu ru shu zi:");rn q=(NODE *)malloc(sizeof(NODE));rn q=L;rn for(i=0;idata);rn p->next=NULL;rn q->next=p;rn q=p;rnprintf("wan cheng\n");rn return 0;rnrnrnrn void *ListInsert(NODE *L)rn int i,e,j; NODE *p,*s;rn printf("Now you will push a number into the list !\n");rn printf("Where do you want to push the number,pleast input the xuhao:");rn scanf("%d",&i);rn printf("Now the number will push before %d! \n",i);rn printf("Please input your number:");rn scanf("%d",&e); printf("\n");rn p=L; j=0;rn while(p!=NULL&&jnext; ++j;rn if(p==NULL||j>i-1) return 0;rn s=(NODE *)malloc(sizeof(NODE));rn s->data=e; s->next=p->next;rn p->next=s;rn printf("The %d have been push into the list! \n",e);rn return 0;rnrnrn void *ListDel(NODE *L)rn int i,j; NODE *p,*q;rn printf("Now you will delete a number from the list! \n");rn printf("Please input the number's xuhao :");rn scanf("%d",&i); printf("\n");rn p=L; j=0;rn while(p->next!=NULL&&jnext; ++j;rn if(p->next==NULL||j>i-1) return 0;rn q=p->next; p->next=q->next;rn printf("The %d is delete successfully!\n",q->data);rn free(q);rn return 0;rnrnrnrn void PrintList(NODE *L)rn NODE *p;rn p=(NODE *)malloc(sizeof(NODE));rn p=L->next;rn while(p!=NULL)rn printf("%5d",p->data);rn p=p->next;rnrnrnrnrn void main()rn NODE *T; int n=0;rn printf("1.InitList 2.ListInsert 3.ListDel 4.PrintfList 5.Exit \n");rn while(n!=5)rn printf("Please choose the gongneng:");rn scanf("%d",&n);rn switch(n)rn case 1:rn InitList(T);rn creat(T);printf("\n");rn break;rn case 2:rn ListInsert(T);rn break;rn case 3:rn ListDel(T);rn break;rn case 4:rn PrintList(T); printf("\n");rn break;rn case 5:rn break;rn rnrn
数据结构之链表——C语言
#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #define ElemType int typedef struct LNode { ElemType data; struct LNode * next; }LinkNode; void CreateListF(LinkNode * &amp;amp;L,ElemType a[],int n...
C语言进阶-数据结构与链表
C语言进阶数据结构与链表 结构,联合,枚举 用结构构成链表
数据结构链表的c语言实现
此程序是用c语言编写,包含链表的实现和对于其中节点的基本操作。
C语言数据结构 链表的基本操作
C语言数据结构 链表的基本操作 链表的五个基本操作全部包含
【数据结构】C语言实现链表
链表的特点: 长度不固定,可以任意增删。 存储空间不连续,数据元素之间使⽤指针相连,每个数据元素只能访问周围的⼀个元素(根据单链表还是双链表有所不同)。 存储密度小,因为每个数据元素,都需要额外存储⼀个指向下⼀元素的指针(双链表则需要两个指针)。 要访问特定元素,只能从链表头开始,遍历到该元素,时间复杂度为 O(n)O(n)。 在特定的数据元素之后插⼊或删除元素,不涉及到其他元素的移
《数据结构与链表》(C语言相关)
关于数据结构C++方面的,就是链表什么的,还不错的一本书,呵呵!
数据结构:链表(C语言实现)
介绍链表之前,我们还需要了解一下线性表、数组与链表的关系。 线性表是一种线性结构,它的特点是在数据元素的非空有限集中: 存在唯一的一个被称作“第一个”的数据元素 存在唯一的一个被称作“最后一个”的数据元素 除第一个外,集合中的每个数据元素均只有一个前驱 除最后一个外,集合中每个数据元素均只有一个后继 简单来谈就是数据元素“一个接一个的排列”,且由同一种类型的数据元素构成的线性结构就是线性表。而...
数据结构——链表实现(c语言)
数据结构——链表实现(c语言)代码://定义数据类型 typedef char ElemType;//定义链表节点 typedef struct Node { ElemType data; struct Node *next; } Node; //定义链表头节点 typedef struct LinkList { int length; struct Node *li
c语言数据结构——链表常用算法
#include <stdio.h> #include <stdlib.h>//本代码的链表是带表头链表,首节点(即表头)不算是元素struct list { int data;//数据域 struct list *next;//指针域,指向下一个节点的地址 };struct list *create_list()//建立一个链表 { // struct list *p = (
C语言数据结构线性表,链表
C语言版数据结构线性表,链表。以后还会上传。大家有资源分享一下
链表创建C语言(数据结构)
数据结构实训程序:创建链表,插入,删除,查询等。 数据结构实训程序:创建链表,插入,删除,查询等。
C语言(数据结构) - 链表的基本操作
1,为什么要用到链表数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。我们希望构造动态的数组,随时可以调整数组的大小,以满足不
c语言数据结构之通用链表
这篇文章对链表这种数据结构进行深入分析和改造,常规的链表数据域的数据类型都是固定的,借助void*通用指针可以实现通用型的链表,链表的数据域是可以存放任何数据类型,而不必每次都将数据类型固定下来,但是要求链表的数据要一致,不能同时存储多种数据类型。这篇文章是学习了一篇微信公众号文章,对其中的代码进行复现,文末会贴出该公众号的链接,并表示对作者的感谢和敬佩! 首先构造链表节点数据类型,每一个节点包含
C语言数据结构之链表篇
线性表的定义     定义n个数据元素的有限序列,记作(a1, a2, …, an)ai 是表中数据元素,n 是表长度 线性表的特点    1. 除第一个元素外,其他每一个元素有一个且仅有一个直接前驱。    2. 除最后一个元素外其他每一个元素有一个且仅有一个直接后继。 顺序表的定义和特点 定义  将线性表中的元素相继存放在一个连续的存储空间中。                 
C语言-数据结构-结点链表
#include #include //顺序结构 void myinsert(int *a,int n) {     int i,num,ipos;     printf("please inputs num or ipos:");     scanf("%d,%d",num,ipos);     if(ipos>n||ipos     {         printf("
数据结构链表C语言实现
课程要求,线性表链式存储结构。有尾接法也有头接法。
c语言数据结构链表的增删查改
c语言数据结构链表的增删查改功能,很简单的
数据结构-C语言实现链表
#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #define OK 1 #define TURE 1 #define FALSE -1 typedef int Status; typedef int Elemtype; typedef struct Node{ Elemtype data; struct Node *next; }Node,*...
C语言数据结构——链表的创建
文章目录概论 概论 什么是链表? 链表是一种常见的重要的数据结构,是动态的能进行存储分配的一种结构 链表的组成: 头指针:存放一个地址,该地址指向第一个元素 结点:用户需要的实际数据和链接结点的的元素 ...
C语言数据结构 链表的合并
有的时候课本上的伪代码真的很让人而无语 今天复习了一下数据结构 发现了一伪代码是这么写的 void reverse_merge(LinkList &A,LinkList &B,LinkList &C)//把元素 递增排列的链表A 和B 合并为C,且C 中元素递减排列,使用原空间 { pa=A->next;pb=B->next;pre=NULL; //pa 和pb 分别指向A,B 的当前
C语言 数据结构 链表的增删查改
分别用函数实现了链表的: 1、增加(头插法,尾插法,有序插入) 2、删除 3、修改 4、查找 C代码 #define _CRT_SECURE_NO_WARNINGS #include&amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;amp;lt;stdlib.h&amp;amp;amp;amp;amp;gt; typedef struct student { int num; float sc
【数据结构】c语言链表实现报数问题
#include<stdio.h> #include<malloc.h> void main() { int i,j, k,n,m; struct baoshu { int number; struct baoshu *next; }*p,*q,*head,*temp; printf("输入人数"); scanf("%d
数据结构链表声明及使用问题(C语言)
数据结构中很简单的声明及使用问题,其实是由于自己对指针的理解不深导致的我感觉。rn声明简单的链表结构rntypedef struct A()rnrn int x;rn struct A *next;rnA,*LInkList;rn问题1.结构体中的A*表示指针,那中括号后的*LinkList是结构体类型的指针?二者有什么区别?rnrn问题2.声明时 A* a;与LinkList a;得效果是否相同?rnrn问题3.声明LinkList &a;与A a;时候效果相同?rnrn问题4.在函数声明时会用到void Delete(LinkList &a),那函数传递的是什么?rnrn我是数据结构的初学者。。。。还望有高手指教,我现在脑子里是一篇混乱,最好帮我理清逻辑。谢谢了!!!!!!!!!!!!!真诚奉上Thank You!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
数据结构(C语言):链表,约瑟夫问题
开始学习数据结构,把写过的代码发上来,希望可以给有需要的人一个参考。 //本代码由 大漠孤烟 整理编写,并验证通过 //求解约瑟夫问题,涉及到链表节点的生成,节点的插入和删除,对理解链表非常有好处 //N个节点围城一圈,从第一个节点开始计数(1),每数到第M的数删除,看最后留下那个数 #include #include #include typedef struct LNode { int
数据结构 链表 c语言 简单问题
正在学习数据结构 有个问题想问一下n下面的代码中为什么 pt == NULL 就说明列表满?nn```n //如果列表满则返回真nbool ListIsFull (const List * plist)nn Node * pt;n bool full;nn pt = (Node *)malloc(sizeof (Node));n if (pt == NULL)n full = true;n elsen full = false;n free (pt);n return full;nn```nn
【求助】数据结构,c语言的链表的排序问题
[color=#FF0000]有没有大神,写过c语言的链表的排序问题,不希望排序中每次冒泡比较都要交换结点,或是结点数据交换,所以想建立一个数组,存放每个结点的地址,通过比较该数组各元素对应的结点元素值,按要求重新排列出数组,然后根据数组再重新链接链表,但是这个想法,始终实现不了,以下是实现代码,编译完全没问题,运行出错,因为是新手,代码中有malloc函数,所以单步调试不了,只好求助大神了![/color]rn[code=c]rn#includern#includernrntypedef struct Linkedrnrn char data;rn struct Linked* next;rnlink,*plink;rnrnrnint main()rnrn plink head,ptr;rn char num = 10;rn char len = 0;rn char j = 0;rn char i = 0;rn plink temp,p[10];rn rn //创建空链表,表头结点rn head = (plink)malloc(sizeof(link));rn head->next = NULL;rn ptr = head;rn rn //动态建立链表rn while(num--)rn rn ptr->next = (plink)malloc(sizeof(link));rn ptr = ptr->next;rn ptr->data = num;rn ptr->next = NULL;rn rn rn //打印链表各结点data值,和链表长度rn ptr = head->next;rn while(ptr!=NULL)rn rn printf("%d ",ptr->data);rn ptr = ptr->next;rn len++;rn rn ptr = head->next;rn printf("\n len:%d\n",len); //得出len = 10,故在变量定义声明部分创建长度为10的数组。rn rn //将链表各结点地址赋给数组P[10]rn while(ptr!=NULL)rn rn p[i] = ptr;rn ptr = ptr->next;rn rn rn //冒泡法根据P[i]指向结点的data值,从新排列数组prn for( i=0;idata > p[j+1]->data )rn rn temp = p[j]; rn p[j] = p[j+1];rn p[j+1] = temp;rn rn rn rn //根据数组P,重新排列链表rn i=0;rn head->next = p[i];rn while(p[i]->next!=NULL)rn rn p[i]->next = p[i+1];rn i++;rn rn rn //打印新的链表rn ptr = head->next;rn while(ptr!=NULL)rn rn printf("%d ",ptr->data);rn ptr = ptr->next;rn rnrnrnrnrn[/code]
数据结构链表问题C语言,帮帮忙
有一个结构Arntypedef struct Arnrn struct A* next;rn ....(其他字段,与问题无关,忽略)rnrnrn rn 下面是问题代码:rn A* code_head;rn A* New;rn A* pCurrent;rnrn code_head = malloc(sizeof(A));rnrn code_head->next = NULL;rn pCurrent = code_head;rn rn New =(A*)malloc((size_t)sizeof(A)); rn rn New->next=NULL;rn pCurrent->next=New;rn pCurrent=pCurrent->next; 最后3句式什么意思? 难道不等价于pCurrent=New? rn rn
c语言数据结构创建链表问题
[code=C/C++]#includern#includern#includernrntypedef struct nodern char data;rn struct node *next;rn LinkList;rnrnLinkList *create()rn LinkList *h,*p,*q;rn h=(LinkList *)malloc(sizeof(LinkList));rn p=h;rn char ch;rn ch=getchar();rn while(ch != '#')rn q=(LinkList *)malloc(sizeof(LinkList));rn q->data=ch;rn p->next=q;rn p=q;//这句什么意思,最好整段全部解释下,数据结构一直不怎么懂rn //p的下一个节点已经指向q,为什么要把q赋给prn ch=getchar();rn rn p->next=NULL;rn return h;rn [/code]
C语言(数据结构)链表创建问题
#includen#include//含malloc.hn#define LEN sizeof( Faction)n//一元多项式结构体ntypedef struct Factionn int coefficient;//系数n int exponent;//指数n struct Faction *next;nFaction;n//创建链表nFaction *creat() n Faction *head, *p1, *p2;n head = NULL;n p1 = p2 = (Faction*)malloc(LEN);n scanf("d% d%", &(p1->coefficient), &(p1->exponent));n p1->next = NULL;n while(p1->coefficient != -1 || p1->exponent != -1) n if(head == NULL)n head = p1;n elsen p2->next = p1;n p2 = p1;n p1 = (Faction*)malloc(LEN);n scanf("d% d%", &(p1->coefficient), &(p1->exponent));n n p2->next = NULL;n return head;nn//输出链表nvoid Print(Faction *head) n Faction *p;n p = head;n while(head != NULL) n printf("d% d%", p->coefficient, p->exponent);n p = p->next;n nn//nint main() n Faction *head;n head = NULL;n head = creat();n Print(head);n return 0;nn请问为什么这段代码输入两个数之后回车会死机?nnnnnnn
一个C语言的数据结构问题,链表的。
它是这样子定义的:rnstruct Nodern char *City;rn int Temp;rn struct Node *Next;rn;rnrntypedef struct Node *Link;rnLink Head;rnint NodeCount;rn其中 Head 是定义链表的头;Node为链表上得一个节点元素,NodeCount是计算链表长度的,有疑问就是为什么可以这样子定义链表的头,也就是这样:[color=#FF0000]Link Head[/color],这是什么样子的东西啊?
C语言 空指针和野指针
int *p1 = NULL;//空指针 int *p2;//野指针指向空的指针是空指针,指向一块未知区域的指针是野指针例如  int *p = 0x123456;   这就是一个野指针,我们并不知道这个地址存的是什么内容注意下面的例子void freePoint(int *&amp;amp;p) { free(p); //注意 释放指针后, 一定要将指针指向NULL //否则p指向的空间是未知...
重拾C语言-空指针
什么是空指针 在声明指针变量时, 如果没有确切地址可以赋值给指针变量, 那这为这个声明的指针变量声明为NULL, 那么这个被声明的指针变量就是空指针! 空指针指向的内存地址为 0, 也就是没有指向具体内存地址 代码片段 #include <stdio.h>void main () { /* 在声明指针变量时, 如果没有确切地址可以赋值给指针变量, 那这为这个声明的指针
linux进程间通信之消息队列
未完待续!
C语言的“空指针”与“野指针”
空指针: 在C语言里,泛型编程靠void类型来实现。即“一切皆空”,那么void类型的指针,是不是大大的提供了某些方便!在使用void*类型的指针时应该注意一下问题:(类型转换!)   1 #include   2   3 int main()   4 {   5         int a=10;   6         void *p=&a;   7   8    
C语言的链表问题
C语言的链表问题,怎么学它和运用它!
c语言链表问题
u->right=u->op1+u->op2;rn 求高人解释一下什么意思,
C语言链表问题
# include rn# define N 26rntypedef struct letterrnrnchar ch;rnstruct letter *link;rn;rnmian()rnrnstruct letter _letter[N],*head,*p;rnint i,j;rnhead=(struct letter *)mallo(sizeof(struct letter));rnhead->link=NULL;rnfor(i=0;ich=_letter[i].ch;rnp->link=head->link;rnp->link=p;rnrnfor(j=0;j