这篇文章主要是根据《数据结构与算法分析--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. MongoDB安装配置教程

    数据是每一前端人员必定接触的一样,所有的数据都是后端来编写,如果自己想练习项目,却没有数据,而是写一些假数据,去编写,或者通过json-server搭建一个数据,今天我们就通过MongoDB来搭建一个 ...

  2. java学习--高效的除模取余运算(n-1)&hash

    没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存中进行计算,然后 ...

  3. es-04-mapping和setting的建立

    mapping和setting, 使用java客户端比较难组装, 可以使用python或者scala 这儿直接在kibana中进行DSL创建 1, mapping 创建索引的时候, 可以事先对数据进行 ...

  4. gateway-workman

    最外层start.php,设置全局启动模式,加载Application里的个子服务目录下应用的启动文件(start开头,这些文件都是workman\work类的子类,在载入文件的同时,这些子服务会生成 ...

  5. offsetTop、offsetLeft、offsetWidth、offsetHeight的用法

    假设 obj 为某个 HTML 控件. obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算上侧位置,整型,单位像素. obj.offsetLeft ...

  6. Go控制语句

    指针 Go虽然保留了指针,但是与其他编程语言不通的是,在Go当中不支持指针运算以及"->"运算符,而是直接采用"."选择符来操作指针目标对象的成员. 操作 ...

  7. 理解nodejs的module模块儿

    module 在 Node.js 模块系统中,每个文件都视为独立的模块,node在运行某个模块儿时会生成一个module对象 Module { id: '.', exports: 2, parent: ...

  8. date时间格式化

    Date方法的扩展 /** * 时间格式化 * @param fmt * @returns {*} * @constructor */ // (new Date()).Format("yyy ...

  9. vscode 自动提示Threejs

    转自:https://blog.csdn.net/github_39125824/article/details/82633993 1.首先,你要安装Node.js 2.在vscode的 查看-> ...

  10. javascript如何获取URL参数的值

    function getUrlParameter(strParame){ var args = new Object( ); var query = location.search.substring ...