这篇文章主要是根据《数据结构与算法分析--C语言描述》一书的链表章节内容所写,该书作者给出了链表ADT的一些方法,但是并没有给出所有方法的实现。在学习的过程中将练习的代码记录在文章中,并添加了一些在测试中需要的函数,因此可能看起来会有点乱。。。

  首先,链表作为一种简单的线性数据结构,主要特征就是“节点”,每个节点包含两个信息,一个是数据域,另外一个是指针域。数据是我们在程序中需要用到的数据,数据类型可以变化,根据需要设定即可,但是指针域就是一个指针,主要作用是指向下一个节点,就是依靠这些指针才将一个一个的节点串起来,就像串辣椒一样,只要提起一串辣椒的头部,那么这一串辣椒中的每一个就都可以按照顺序找到。理解链表的最好的方式就是用图形的方式,其实大部分数据结构教材都是利用图形的方法来讲解大部分数据结构的,人的大脑对图形的理解明显比文字要更好一些。啥都不说了,打开AUTOCAD,画个图。

上图就是一个链表结构,其中A1到A5 是我们要用到的数据,Ptr是指针的名字,箭头指向被指针指向的节点。最左边有一个被称之为头节点的节点,这是一个没有数据,只有指向第一个真正存储数据的节点的节点,有的人在链表中不使用头节点。

下面看看链表的一些操作,首先分析一下,链表需要 一个创建程序,就是创建一个链表,可以叫做CreateList(),还需要判断链表是否为空的,叫做IsEmpty(),还有需要向链表中插入元素,可以叫做Insert(),同样需要删除元素 Delete()。这是最主要的几个操作。

上面提到的书的作者给出了几种方法:

 1 #ifndef _LIST_H_
 2 #define _LIST_H_
 3
 4 typedef int ElementType;
 5 struct Node;
 6 typedef struct Node *PtrToNode;
 7 typedef PtrToNode List;
 8 typedef PtrToNode Position;
 9
10 List CreateList();
11 List Makeempty(List L);
12
13 int IsEmpty(List L);
14 int IsLast(Position P, List L);
15 Position Find(ElementType X,List L);
16 void Delete(ElementType X,List L);
17 Position FindPrevious(ElementType X,List L);
18 void Insert(ElementType X,List L,Position P);
19 void DeleteList(List L);
20 Position Header(List L);
21 Position First(List L);
22 Position Advance(Position P);
23 ElementType Retrieve(Position P);
24
25 #endif

比较多,但是都比较简单,来看看作者的实现

  1 #include"linkedlist.h"
  2 #include<stdlib.h>
  3
  4 typedef int ElementType;
  5 struct Node
  6 {
  7     ElementType Element;
  8     Position Next;
  9 };
 10
 11 void PrintList(List L)
 12 {
 13     Position P;
 14     P = L->Next;
 15     while(P != NULL)
 16     {
 17         printf("%d ",P->Element);
 18         P = P->Next;
 19     }
 20 }
 21
 22 List CreateList()
 23 {
 24     List L ;
 25     L = malloc(sizeof(struct Node));
 26     L->Next = NULL;
 27     return L;
 28 }
 29
 30
 31
 32 List MakeEmpty(List L)
 33 {
 34     Position P,Tmp;
 35     P = L->Next;
 36     L->Next = NULL;
 37     while(P != NULL)
 38     {
 39         Tmp = P->Next;
 40         free(P);
 41         P = Tmp;
 42     }
 43     return L;
 44 }
 45 void Printlist(List L)
 46 {
 47     Position P;
 48     P = L->Next;
 49     while(P != NULL)
 50     {
 51         printf("%d",P->Element);
 52         P = P->Next;
 53     }
 54 }
 55
 56 int IsEmpty(List L)
 57 {
 58     return  L->Next == NULL;
 59 }
 60
 61 int IsLast(Position P,List L)
 62 {
 63     return P->Next == NULL;
 64 }
 65
 66 Position Find(ElementType X,List L)
 67 {
 68     Position P;
 69     P = L->Next;
 70     while(P != NULL && P->Element != X)
 71         P = P->Next;
 72     return P;
 73 }
 74
 75 void Delete(ElementType X,List L)
 76 {
 77     Position P, TemCell;
 78     P = FindPrevious(X,L);
 79     if(!IsLast(P,L))
 80     {
 81         TemCell = P->Next;
 82         P->Next = TemCell->Next;
 83         free(TemCell);
 84     }
 85 }
 86
 87 Position FindPrevious(ElementType X,List L)
 88 {
 89     Position P;
 90     P = L;
 91     while(P->Next != NULL && P->Next->Element != X)
 92         P = P->Next;
 93     return P;
 94 }
 95
 96
 97 void Insert(ElementType X ,List L,Position P)
 98 {
 99     Position TmpCell ;
100     TmpCell = malloc (sizeof(struct Node));
101
102     TmpCell->Element = X;
103     TmpCell->Next = P->Next;
104     P->Next = TmpCell;
105 }

转载于:https://www.cnblogs.com/wangxiaoyong/p/6789155.html

数据结构入门之链表(C语言实现)相关推荐

  1. 数据结构入门——单向链表

    基本知识点 注:数据结构系列将持续更新,欢迎交流讨论- 单向链表是一种线性结构 优点:作数据的删除.插入简单:缺点:数据查找慢 组成:数据域.后继节点的一个指针域: 单向链表,后继指针指向下一个结点 ...

  2. 数据结构与算法入门教程(C语言实现版)

    个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 C语言数据结构与算法 BF和 ...

  3. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  4. C语言中用链表构建栈讲解,C语言数据结构之使用链表模拟栈的实例

    C语言数据结构之使用链表模拟栈的实例 以下是"使用链表模拟栈"的简单示例: 1. 用C语言实现的版本 #include #include typedef char datatype ...

  5. 数据结构几个最简单的阐述完整版(带你入门:链表,栈,队列,哈希表,树)通俗易懂简单明了

    数据结构几个最简单的阐述完整版 一.链表(Linked list): 如下图是一个链表: 1.链表是无须存储在连续的空间内,一般都是分散存储于内存中.(指针是指向下一个数据的内存地址) 2.所有要访问 ...

  6. 用c语言实现链表数据保存,数据结构链表C语言实现.doc

    数据结构链表C语言实现 数学与信息技术学院2016~2017(下)学年 计科专业2015级<数据结构>实验报告 2 学号:2015201018 姓名:汪继超 实验名称线性表的链式存储结构完 ...

  7. c语言中主函数创建链表,主函数怎么调用函数(数据结构,创建链表)

    主函数怎么调用函数(数据结构,创建链表)0 rnxm44602018.09.29浏览179次分享举报 #include#include"stdlib.h"typedefintEle ...

  8. 数据结构中单链表的存储c语言,单链表一 - 数据结构与算法教程 - C语言网

    1. 单链表概念&设计 单链表是一种链式存取的数据结构,,链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指 ...

  9. 数据结构入门(一级)

    数据结构和算法的入门:在这里我们先回答大家三个问题1. 为什么要学习数据结构2. 有哪些数据结构3. 学习数据结构的四种境界知道了这三个问题之后呢,再来进行具体内容的一个学习,先看第一个,为什么要学些 ...

最新文章

  1. 虐狗日记:和小冰同居的日子
  2. Android之SharedPreferences详解
  3. 在C#中调用windows API函数
  4. git 多仓库源 配置
  5. java开发和python哪个好学_学编程,Python和Java哪个更好?
  6. hdu4011(水贪心)
  7. python循环嵌套的外循环必须完全包含内循环_Python:循环与嵌套循环实现规律数列...
  8. Redis sorted set(有序集合)
  9. 将应用程序11M内存占用,降至500K左右
  10. _stdcall函数调用约定详解
  11. 网络空间安全复习归纳
  12. 读程士宏之《测度论与概率论基础》
  13. H5 - 手机 APP 接入支付宝、微信、银联支付流程汇总
  14. SpringBoot系列
  15. 基于STM32F407的FSMC功能实现对TFT的控制
  16. Canon MF113W激光打印机双面打印方法
  17. 施工建设企业为什么要使用智慧工地数管理系统?
  18. c语言bit作用,c语言中bit的用法
  19. 基于python的气象数据分析统计服_基于Python的风向风速数据分析的设计与实现
  20. 模拟实验室合成器插件-Arturia Analog Lab v5.2.0 WiN

热门文章

  1. java 多个 panel_java – 在JFrame中组织多个JPanel的好方法是...
  2. 莫烦python博客_《莫烦Python》笔记 -- numpy部分
  3. php+控制器+数据库,Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法_PHP...
  4. 如何查看服务器文件进程,如何查看服务器上的所有进程
  5. java 调用groovy_Java调用Groovy脚本
  6. 修复计算机的英语,Windows Repair最新版
  7. python无所不能_python-列表
  8. mac 如何配置mysql_MAC下安装与配置MySQL
  9. html中删除代码怎么写,html空格代码怎么写?
  10. java子类和父类实例_java中父类与子类之间的转换示例