关于链表一些有趣的东西
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指向的内存空间给释放了,所以程序无法继续的运行。。。