您的位置:首页 > 运维架构 > Linux

Linux C 学习 单向链表

2016-06-18 23:54 459 查看
最近从Linux C数据结构算法学起,下面是一个单向链表的写法,代码如下:

[cpp] view
plain copy

#include <stdio.h>

#include <malloc.h>

int n=0;

typedef struct code

{

int data;

struct code *next;

}List;

List *creatlink()

{

List *head;

List *p1;

List *p2;

head=NULL;

p1=(List *)malloc(sizeof(List));

p2=(List *)malloc(sizeof(List));

printf("Please print the data you want:(end is 0)\n");

scanf("%d",&p1->data);

while(p1->data!=0)

{

n++;

if(n==1)

{

head=p1;

}

else

{

p2->next=p1;

}

p2=p1;

p1=(List *)malloc(sizeof(List));

scanf("%d",&p1->data);

// printf("\n%d\n",p1->data);

}

free(p1);

p2->next=NULL;

return(head);

}

void Print(List *head)

{

List *p;

p=head;

if(head!=NULL)

do

{

printf("[%d]->",p->data);

p=p->next;

}

while(p!=NULL);

printf("\nover!\n");

}

int main()

{

List *head;

head=creatlink();

Print(head);

return(0);

}

结果如下:



单向链表建立容易犯错误的是这一块:

if(n==1)

{

head=p1;

}

else

{

p2->next=p1;

}

p2=p1;

p1=(List *)malloc(sizeof(List));

scanf("%d",&p1->data);

// printf("\n%d\n",p1->data);

}

先判定头指针,然后再重新为p1申请一片内存,来存放下一个链表里的内容

malloc()最容易出现的问题是内存泄露,所以一定要记得free();

下面有个例子:

兄弟问:" free(p);p=NUll;",为啥free(p)之后,还要置p=NULL呢?有必要么?

free(p)只是将p指向的空间释放掉了,但是p并不等于NULL;

code:

int main()

{

int *p;

p = (int *)malloc(sizeof(int) * 10);

printf("before free: p=%p\n",p);

free(p);

printf("after free: p = %p\n",p);

printf("%d\n",p[0]);

p=NULL;

printf("%d\n",p[0]);

}

result:

before free: p=0x8fa7008

after free: p = 0x8fa7008

0

段错误

也就是p虽然有值,但其指向的空间已经被释放掉了。如果在后续的code中再用到p,就会出现错误,而这种错误是不太明显的。如果显式的置为null的话,就可以使错误马上显现出来。从而避免了调试程序中种种诡异的麻烦。

结论:

如果在程序中free(p)之后,p不会再用,则令p=NULL无所谓。

如果在程序中free(p)之后,p还会用到,则令p=NULL,还原p为纯净的变量,便于以后差错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: