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

关于链表一些有趣的东西

作者: 梦在原点 | 来源:发表于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指向的内存空间给释放了,所以程序无法继续的运行。。。

    相关文章

      网友评论

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

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