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

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

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

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

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

 #ifndef _LIST_H_
#define _LIST_H_ typedef int ElementType;
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position; List CreateList();
List Makeempty(List L); int IsEmpty(List L);
int IsLast(Position P, List L);
Position Find(ElementType X,List L);
void Delete(ElementType X,List L);
Position FindPrevious(ElementType X,List L);
void Insert(ElementType X,List L,Position P);
void DeleteList(List L);
Position Header(List L);
Position First(List L);
Position Advance(Position P);
ElementType Retrieve(Position P); #endif

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

 #include"linkedlist.h"
#include<stdlib.h> typedef int ElementType;
struct Node
{
ElementType Element;
Position Next;
}; void PrintList(List L)
{
Position P;
P = L->Next;
while(P != NULL)
{
printf("%d ",P->Element);
P = P->Next;
}
} List CreateList()
{
List L ;
L = malloc(sizeof(struct Node));
L->Next = NULL;
return L;
} List MakeEmpty(List L)
{
Position P,Tmp;
P = L->Next;
L->Next = NULL;
while(P != NULL)
{
Tmp = P->Next;
free(P);
P = Tmp;
}
return L;
}
void Printlist(List L)
{
Position P;
P = L->Next;
while(P != NULL)
{
printf("%d",P->Element);
P = P->Next;
}
} int IsEmpty(List L)
{
return L->Next == NULL;
} int IsLast(Position P,List L)
{
return P->Next == NULL;
} Position Find(ElementType X,List L)
{
Position P;
P = L->Next;
while(P != NULL && P->Element != X)
P = P->Next;
return P;
} void Delete(ElementType X,List L)
{
Position P, TemCell;
P = FindPrevious(X,L);
if(!IsLast(P,L))
{
TemCell = P->Next;
P->Next = TemCell->Next;
free(TemCell);
}
} Position FindPrevious(ElementType X,List L)
{
Position P;
P = L;
while(P->Next != NULL && P->Next->Element != X)
P = P->Next;
return P;
} void Insert(ElementType X ,List L,Position P)
{
Position TmpCell ;
TmpCell = malloc (sizeof(struct Node)); TmpCell->Element = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}

数据结构入门之链表(C语言实现)的更多相关文章

  1. 《数据结构与算法分析:C语言描述》读书笔记

    我们数据结构的课用了这本英文教材,作者是Mark Allen Weiss.总体来说比<算法导论>简单很多,但内容上交集非常大.其实是因为去掉了大多数证明和数学,对于没有耐心看符号和公式的人 ...

  2. 链表c语言实现

    链表(c语言实现)--------------小练习   #include <stdio.h> #include <stdlib.h> #include <string. ...

  3. 单链表 C语言 学习记录

    概念 链接方式存储 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的). 链表中 ...

  4. 数据结构入门第二课(浙大mooc)

    数据结构入门第二课 目录 数据结构入门第二课 引子 多项式的表示 方法1 顺序结构表示多项式各项 方法2 顺序结构表示非零项 方法3 链表结构存储非零项 多项式问题的启示 线性表 线性表的抽象数据类型 ...

  5. python数据结构与算法——链表

    具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...

  6. pandas教程1:pandas数据结构入门

    pandas是一个用于进行python科学计算的常用库,包含高级的数据结构和精巧的工具,使得在Python中处理数据非常快速和简单.pandas建造在NumPy之上,它使得以NumPy为中心的应用很容 ...

  7. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  8. [数据结构]P1.1 链表结构

    * 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任. 2019年4月8日 Stan Zhang 2019年4月8日  格物致知,经世致用. [面试题]1.为什么要用链表? 数组具有的缺陷 ...

  9. SDUT OJ 数据结构实验之链表九:双向链表

    数据结构实验之链表九:双向链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

随机推荐

  1. Linux安装go语言开发包

    1.下载go语言安装包,eg:go1.7.1.linux-amd64.tar.gz2.安装go语言 $ cd /home/xm6f/dev $ tar -zxvf go1.7.1.linux-amd6 ...

  2. Disrunptor多生产者多消费者模型讲解

    多生产者多消费者模拟需求:1.创建100个订单生产者,每个生产者生产100条订单,总共会生产10000条订单,由3个消费者进行订单消费处理.2.100个订单生产者全部创建完毕,再一起生产消费订单数据 ...

  3. C/C++求职宝典21个重点笔记(常考笔试面试点)

    这是我之前准备找工作时看<C/C++求职宝典>一书做的笔记,都是一些笔试面试中常考的重点难点问题,但比较基础,适合初学者看. 1. char c = '\72'; 中的\72代表一个字符, ...

  4. 阿里2015校招面试回忆录(成功拿到offer)

    1. 引言 继上次“百度2015校园招聘面试题回忆录(成功拿到offer)”文章过后,大家都希望除了题目之外,最好能给出自己当时的回答情况,看看有没有什么回答技巧,这样更有参考价值. 嗯,建议的很对, ...

  5. java为什么使用TypeReference

    用途 在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如: void testTypeReference() { List<Integer> ...

  6. windows环境下搭建Java开发环境(一):jdk安装和配置

    一.资源下载 官网:http://www.oracle.com/technetwork/java/javase/downloads/index.html 本人安装的是jdk1.8,百度云资源:链接:h ...

  7. 从PHP5.0到PHP7.1的性能全评测

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

  8. SpringMVC之使用Servlet原生API作为参数

    SpringMVC的handler接收如下的ServletAPI类型的参数: • HttpServletRequest • HttpServletResponse • HttpSession • ja ...

  9. 1657 Distance on Chessboard(简单计算题)

    描述 国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间.如下图所示:王.后.车.象的走子规则如下: 王:横.直.斜都可以走,但每步限走一格. 后:横.直.斜都可以走,每步格数不受限制. 车 ...

  10. WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter

    一.如何从 Datagrid 中获得单元格的内容 DataGrid 属于一种 ItemsControl, 因此,它有 Items 属性并且用ItemContainer 封装它的 items. 但是,W ...