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

[cpp] view plaincopy
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. int n=0;
  4. typedef struct code
  5. {
  6. int data;
  7. struct code *next;
  8. }List;
  9. List *creatlink()
  10. {
  11. List *head;
  12. List *p1;
  13. List *p2;
  14. head=NULL;
  15. p1=(List *)malloc(sizeof(List));
  16. p2=(List *)malloc(sizeof(List));
  17. printf("Please print the data you want:(end is 0)\n");
  18. scanf("%d",&p1->data);
  19. while(p1->data!=0)
  20. {
  21. n++;
  22. if(n==1)
  23. {
  24. head=p1;
  25. }
  26. else
  27. {
  28. p2->next=p1;
  29. }
  30. p2=p1;
  31. p1=(List *)malloc(sizeof(List));
  32. scanf("%d",&p1->data);
  33. // printf("\n%d\n",p1->data);
  34. }
  35. free(p1);
  36. p2->next=NULL;
  37. return(head);
  38. }
  39. void Print(List *head)
  40. {
  41. List *p;
  42. p=head;
  43. if(head!=NULL)
  44. do
  45. {
  46. printf("[%d]->",p->data);
  47. p=p->next;
  48. }
  49. while(p!=NULL);
  50. printf("\nover!\n");
  51. }
  52. int main()
  53. {
  54. List *head;
  55. head=creatlink();
  56. Print(head);
  57. return(0);
  58. }

结果如下:

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

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 学习 单向链表相关推荐

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

    线性表存储结构分为顺序存储.链式存储.        顺序存储的优点: 顺序存储的缺点:        链表就是典型的链式存储,将线性表L = (a0,a1,a2,........an-1)中个元素分 ...

  2. 单向链表操作详解(二)[The End]

    /* 接着讲(测试编译时,请把相应的函数及测试代码放到上一讲代码的相关地方): 排序(选择.插入.冒泡) 插入(有序) */ /* ================================== ...

  3. c++使用单向链表存储一组有序数据_《一起学习java和数据结构》系列-数组和链表...

    数组 数组是一个线性表数据结构.它用一段连续的内存地址空间,来存储一些相同类型的数据. 从上面的定义,我们不难看出几个关键词. 线性表:顾名思义,线性表就是数据排列成一条线的数据结构.每一个线性表只有 ...

  4. Rust学习笔记(13)——struct、Option和Box组合应用实现单向链表

    前面深入学习了struct.Option和Box的所有权约束及各种场景的使用,现在用struct.Option和Box组合来实现一个单向链表,并实现链表常见的头部插入.删除,尾部插入.删除,中间插入. ...

  5. Rust学习笔记(14)——struct、Option和Box组合应用实现单向链表之二

    在上一篇学习了链表的头部插入和删除,今天尝试一下尾部的插入和删除. 一.尾部插入 在链表的尾部插入,分几种情况: 链表为空:直接将头指针指向新节点:否则进入第二步: 从头结点开始向后一直找到尾节点,将 ...

  6. 数据结构 | 单向链表学习总结

    单向链表学习总结 简介 总结 链表介绍 链表定义 链表函数 计算链表的长度 将列表转换为链表 LeetCode:剑指 Offer 22. 链表中倒数第k个节点 双向链表学习总结:python | 双向 ...

  7. PHP算法学习(6) 单向链表 实现栈

    svn地址:svn://gitee.com/zxadmin/live_z 这个是模拟栈的先进后出的一个链表操作,自动维护链表,当然你也使用SPL的栈 测试版本php 5.4 ,5.6,7.0,7.2 ...

  8. 【了解链表的适用场景;掌握单向链表、双向链表的使用】(学习笔记18--链表)

    目录 单向链表 双向链表 链表中的节点和火车的车厢一样,是一个连着一个的,通常将当前节点的前一个或上一个节点称为它的前驱节点,将后一个或者下一个节点称之为它的后继节点.链表中的第一个节点被称为头节点, ...

  9. 【程序设计基础 学习笔记】单向链表(TBC)

    好耶,开始学链表了.尽管单向链表内容比较简单,对C语言一无所知的蒟蒻还是决定写下来,以帮自己捋清逻辑并供复习使用. 因为是初学者,代码码风很丑,希望大家多多包涵(抱拳),欢迎各路大神的指点! 感谢来自 ...

最新文章

  1. java 多线程下载器_Java多线程的下载器(1)
  2. 跨域解决方案之CORS
  3. EF optimize the perfermance
  4. 软设考试笔记--数据流图
  5. Linux内核tracepoints
  6. 新版征信报告实施之后,信用卡养卡套现真的要凉凉了?
  7. Django框架——模型(数据库操作)
  8. Know more about Cache Buffer Handle
  9. Transaction 那点事儿,Spring事务管理
  10. 理解list和vector的区别
  11. 军职在线大学生计算机基础答案,大学计算机基础试题-及答案~完整版.doc
  12. 最新米酷6.26影视源码+解析接口+步骤
  13. chrome浏览器debug vue项目,跳过vue源码
  14. vs2012程序打包部署下载InstallShield2015LimitedEdition的下载及安装打包整套教程
  15. 女巫的魔法-第12届蓝桥杯Scratch省赛3真题第2题
  16. Cartesi 举办的2023 黑客马拉松
  17. 压缩png命令cmd_使用pngquant工具对PNG格式图片进行压缩
  18. 音频处理工具 sox 使用
  19. DHCP欺骗攻击(yersinia应用)
  20. praat 使用记录

热门文章

  1. Eclipse相关快捷键
  2. 从Jupyter Notebook到脚本
  3. Tensorflow入门神经网络代码框架
  4. leetcode 149. 直线上最多的点数
  5. Java—servlet简单使用
  6. 用什么代码可以改变键盘_为什么我改变了对代码质量的看法
  7. javascript在html中的延迟与异步
  8. 矩阵快速幂及斐波那契数列模板
  9. Xcode缓存数据清除
  10. PHP十六个魔术方法