Linux C 学习 单向链表

原创 2015年11月17日 21:01:44

最近从Linux C数据结构和算法学起,下面是一个单向链表的写法,代码如下:

#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为纯净的变量,便于以后差错。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Linux C 数据结构---链表(单向链表)

上一篇我们讲到了线性表,线性表就是数据元素都一一对应,除只有唯一的前驱,唯一的后继。        线性表存储结构分为顺序存储、链式存储。        顺序存储的优点:        顺序存储的缺点...

Linux-C学习笔记--单链表的“浮云”操作

链表在C语言项目中很常见,学号链表,先从单链表开始,通常在学习阶段的单链表实现是基于某种数据类型或结构量身定做的操作方法,这种方法,没有通用性,在实际项目开发中,段不可取。于是乎,学习一种“浮云”般对...

Exynos4412 Uboot 编译工具 —— 交叉工具链 arm-linux-gcc 的安装

1、什么是交叉编译?

内联函数 —— C 中关键字 inline 用法解析

一、什么是内联函数        在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗,为了解决,特别的引入了inline修饰符,表示为内联函数。      ...

Linux C 链表(新建节点、添加节点)

Linux C 链表(新建节点、添加节点)

Linux C编程连载【5】- 关于双链表“掉链子”的问题

【问题】用双链表实现贪吃蛇时,用gcc编译后,执行发生段错误。用gdb调试发现错误位于删除操作,后检查发现真正的原因出在插入操作。如题所示,双链表掉链子了,没接上。 【分析】 如图1所示,...

Linux c 算法与数据结构--双向链表

最近一直在巩固C语言基础,写的一些文章主要也是当自己的学习笔记,肯定会出现一些小错误,或者内容比较初级,希望通过自己的努力写出一些高水平的博文! 链表是linux c中非常重要的数据结构,双向链表与单...

基于Linux C 单链表的通讯录程序

#include #include #include #include #define MAX_NAME 100 #define MAX_TEL 11 #define OK ...

使用LINUX C实现一个链表,要求:链表节点构成:姓名、分数、下一个节点指针...

使用LINUX C实现一个链表,要求:(共30分) (1) 链表节点构成:姓名、分数、下一个节点指针;(9分) (2) 构建完成链表节点数据输入,至少5个节点数据; (9分) (3) 保存链...

C——单向链表的学习

有时在写代码、阅读代码过程中,会感到自己的C语言基础知识不是很牢,因此会导致效率降低。所以,适时地再回过头来温习一下有关的基础知识会增进自己的理解,帮助是很大的。 在此,我自己写了一个程序,以便学习...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux C 学习 单向链表
举报原因:
原因补充:

(最多只允许输入30个字)