关闭

Linux C 学习 单向链表

标签: 链表数据结构算法mallocfree
1452人阅读 评论(0) 收藏 举报
分类:

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

1
0
查看评论

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

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

链表的c语言实现以及根据linux内核中链表的实现过程

链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。 下面代码是链表的两种实现方式,其中方式一就是按照数据结构书中对链表的实现过程,而方式二是根据linux内核中关于链表的实现。两者的最大区别是方式一中数据是存储在链表结构中的,而方式二中,是在数...
  • lickylin
  • lickylin
  • 2012-09-23 20:36
  • 3369

Linux C 学习 单向链表

最近从Linux C数据结构和算法学起,下面是一个单向链表的写法,代码如下: [cpp] view plain copy #include    #include   ...
  • qq_21593899
  • qq_21593899
  • 2016-06-18 23:54
  • 176

C语言学习之单向链表操作

该文件为单向链表操作的一些接口:(如发现有错误的地方,及时告知,不胜感激!) list.h #ifndef  _CHAINLIST_H_ #define  _CHAINLIST_H_ typedef struct {     ch...
  • qlx846852708
  • qlx846852708
  • 2015-02-04 10:06
  • 1072

C语言-------实现一个简单的单向链表

编写一个链表程序,在程序中实现简单的功能#include #include struct node{ int num; char name[20]; struct node* next; //指向下一个地址的指针 }; //声明一个链表,此时内存不分配内存 typed...
  • zer1123
  • zer1123
  • 2017-02-09 20:12
  • 2451

linux 下c语言创建单向动态链表的理解

首先将代码段贴上来:  本文用// 添加注释 因为 #和包含库函数冲突 #include #include              //分配内存要加上这个库函数 struct weapon {   ...
  • moxiaoxuan123
  • moxiaoxuan123
  • 2017-04-23 16:21
  • 310

C语言之单向链表封装

Copyright@Ucare1990-2017.03.23 于南山大学城 ===一图解决所有问题=== 时间仓促,暂给大家分享内存模型,以后有时间再详细追加 个人认为,只有脑袋里时刻有内存模型,才能很好的解决数据结构问题 附;对于链表的操作,无非 增/减/删/查/文件I...
  • Ucare1990
  • Ucare1990
  • 2017-03-23 20:30
  • 107

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

线性表存储结构分为顺序存储、链式存储。        顺序存储的优点:        顺序存储的缺点:     ...
  • qq_21593899
  • qq_21593899
  • 2016-06-19 00:01
  • 112

C——单向链表的学习

有时在写代码、阅读代码过程中,会感到自己的C语言基础知识不是很牢,因此会导致效率降低。所以,适时地再回过头来温习一下有关的基础知识会增进自己的理解,帮助是很大的。 在此,我自己写了一个程序,以便学习理解数据结构里很基本也很重要的一个部分——链表。当然,链表也可以细分为单链表、双向链表等。这里我写的...
  • baweiyaoji
  • baweiyaoji
  • 2017-07-16 16:00
  • 295

Linux C 单向链表1

线性表存储结构分为顺序存储、链式存储。        顺序存储的优点:        顺序存储的缺点:        链...
  • wuyu92877
  • wuyu92877
  • 2017-11-17 11:56
  • 62
    个人资料
    • 访问:1093160次
    • 积分:13430
    • 等级:
    • 排名:第1163名
    • 原创:334篇
    • 转载:21篇
    • 译文:0篇
    • 评论:186条
    博客专栏
    最新评论