Linux C 学习 单向链表
2015-11-17 21:01
776 查看
最近从Linux C数据结构和算法学起,下面是一个单向链表的写法,代码如下:
结果如下:
单向链表建立容易犯错误的是这一块:
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为纯净的变量,便于以后差错。
#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为纯净的变量,便于以后差错。
相关文章推荐
- centos国内的源
- linux下c++读文件夹下的文件及文件夹笔记
- Linux<十四> 软件安装管理
- linux APT 命令
- linux source filename
- linux 命令行
- Linux常用命令
- linux第一次实验报告
- 01 Linux 入门 各发行版 命令 时间 日期 关机 帮助
- linux环境设置export
- Linux的IO性能监控工具iostat详解
- Linux下vi常用命令(笔记)
- Linux 命令总结
- Linux 命令总结
- Linux中vi显示中文乱码的问题
- 忘记Linux系统root密码
- 如何利用Linux系统做一个NFS服务器
- Linux下各个文件夹的用处
- Linux 路由配置 route命令 /etc/sysconfig/static-routes
- centos7 firewall