二叉树之下

关于链表一些有趣的东西

2018-04-24  本文已影响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指向的内存空间给释放了,所以程序无法继续的运行。。。

上一篇下一篇

猜你喜欢

热点阅读