美文网首页二叉树之下
关于链表一些有趣的东西

关于链表一些有趣的东西

作者: 梦在原点 | 来源:发表于2018-04-24 22:44 被阅读10次

今天刷题的时候遇见了这个问题

题目出自leetcode 21:合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

我想正好可以借这个机会复习一下数据结构的链表的结构,感觉忘的差不多了。。。首先我写出了一个简易的链表代码如下

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

typedef struct Node
{
    int data;
    struct Node* next;
}NODE,*pNode;

pNode CreatList()
{
    pNode Ps=(pNode)malloc(sizeof(NODE));
    Ps->data = -1;
    Ps->next = NULL;
    return Ps;
}

void add(pNode Ps,int val)
{
    pNode pNew=(pNode)malloc(sizeof(NODE));
    if(pNew==NULL)
    {
        printf("内存分配失败");
        exit(-1);
    }
    if(Ps->next == NULL)
    {
        pNew->data = val;
        Ps->next = pNew;
        pNew->next = NULL;
    }
    else
    {
        pNode P = Ps;
        while(P->next!=NULL)
        {
            P=P->next;
        }
        pNew->data = val;
        P->next = pNew;
        pNew->next = NULL;
    }
    free(p);
}

void ListPrint(pNode Ps)
{
    pNode P = Ps->next;
    while(P!=NULL)
    {
        printf("%d\n",P->data);
        P=P->next;
    }
}

int main()
{
    pNode Pa;
    Pa = CreatList();
    add(Pa,1);
    add(Pa,1);
    add(Pa,1);
    add(Pa,1);
    add(Pa,1);
    ListPrint(Pa);
    return 0;
}

不过在运行的时候我发现,不是我期望的那个结果,没有任何的显示,仔细的检查代码之后,我发现在add函数里的最后我加了一句free(P),我尝试这将它删掉,程序正常的运行了,结果如下:


image.png

不过我觉得这是很有意思的事情,我查找了些关于free函数的资料:

void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

好像并没有解决我的疑问,我又找到了这个

free()释放的是指针指向的内存!注意!释放的是内存,不是指针!指针并没有被释放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。

也就是说我在free(P)这一句中,我把P指向的内存空间给释放了,所以程序无法继续的运行。。。

相关文章

  • 关于链表一些有趣的东西

    今天刷题的时候遇见了这个问题 题目出自leetcode 21:合并两个有序链表 将两个有序链表合并为一个新的有序...

  • 关于FragmentPagerAdapter的一些有趣东西

    这两个月经历了萌发离职念头到开始复习、投简历、面试、走流程,终于在这周入职了新公司。所以现在又可以开始写写博客,不...

  • 关于链表的一些

    反转链表 需要考虑空链表,只有一个结点的链表 结果展示: ————————————————————————————...

  • # 数据结构之循环链表(四)

    在上一篇博客中,我讲了有关于单循环链表的一些基本操作。在这篇博客中,我来讲述一下双向链表和双向循环链表。 循环链表...

  • 工作笔记(六)

    关于链表的两个示例 编程中操作链表是最基础也是最容易让人搞晕的东西。两则demo警示自己不要忘记。 1. 翻转链表...

  • 一些很有趣的东西

    黑窗口 打开"运行"对话框(Win+R),输入cmd; tab 补全功能 dir: directory 列出当前文...

  • 文博会,一些有趣的东西

  • 记录一些有趣的东西

    1、随机获取一种颜色 2、Math.min()和Math.max()谁大? 这是因为Math.min() 返回 I...

  • 栈的实现

    基于顺序表的栈实现: 测试代码: 基于顺序表的链表实现: 基础数据类: 测试代码: 以为这个会比链表东西会多一些,...

  • 链表,单链表

    关于链表的一些知识 ifndef LINKLIST_H define LINKLIST_H typedef voi...

网友评论

    本文标题:关于链表一些有趣的东西

    本文链接:https://www.haomeiwen.com/subject/momslftx.html