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

  这篇文章主要是根据《数据结构与算法分析--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 }
时间: 2024-10-27 13:32:58

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

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

[转]算法与数据结构——入门总结与自学资料推荐

[转]算法与数据结构——入门总结与自学资料推荐 本文转自(http://www.cnblogs.com/jiahuix/p/4868881.html) 一.大纲 博客:董西城.Vamei 思维导图下载地址:http://pan.baidu.com/s/1gdCqW8r 二.数据结构资料推荐 数组:查找快O(1),插入删除慢O(n) 链表:查找慢O(n),插入删除快O(1) 块状链表:查找插入删除O(sqrt(n)):数组+链表: 队列:先进先出 堆栈:先进后出 双端队列:队列与堆栈结合,有hea

C#数据结构-单链表

理论基础: 链表是用一组任意的存储单元来存储线性表中的数据元素. 如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(Singly Linked List). 单链表由头引用H唯一确定.头引用指向单链表的第一个结点,也就是把单链表第一个结点的地址放在H中. C#实现: 1接口 引用线性表的接口IListDS<T> 2实现 首先,必须定义一个单链表的节点类.  1 public class Node<T> 2    { 3        private T data

(续)顺序表之单循环链表(C语言实现)

单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点, 使得整个链表形成一个环. C实现代码如下: #include<stdio.h> typedef struct node { int data; struct node *next; }Node; //链表的初始化 Node* InitList(int number) { int i; Node *pHead=(Node *)malloc(sizeof(Node)); Node *TempHead=pHead; N

《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Alpha-Beta剪枝

2014.07.08 22:43 简介: “搜索”与“剪枝”几乎是如影随形的.此处的“搜索”指的是带有回溯算法的深度优先搜索. 在之前的“Minimax策略”中我们给出了一个三连棋的程序,运行后你就知道计算一步棋要花多少时间. 为了计算最优的一步棋,我们可能需要递归9万多次.如果毫无疑问这种阶乘式的穷举过程必须通过剪枝来加速. 本篇介绍一种用于Minimax策略的剪枝思路——α-β剪枝. 剪枝的英语是pruning,所以不要想当然说成trimming. 图示: 在上一篇讲解Minimax策略的博

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双

数据结构实验之链表五:单链表的拆分

数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory limit: 65536K 题目描述 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数.两个子链表中数据的相对次序与原链表一致. 输入 第一行输入整数N;: 第二行依次输入N个整数. 输出 第一行分别输出偶数链表与奇数链表的元素个数: 第二行依次输出偶数子链表的所有数据: 第三行依次输出奇数子链表的所有数据. 示例输入 10 1 3 22

数据结构实验之链表三:链表的逆置

数据结构实验之链表三:链表的逆置 Time Limit: 1000MS Memory limit: 65536K 题目描述 输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据. 输入 输入多个整数,以-1作为结束标志. 输出 输出逆置后的单链表数据. 示例输入 12 56 4 6 55 15 33 62 -1 示例输出 62 33 15 55 6 4 56 12 提示 不得使用数组. 来源 示例程序 /*************

数据结构实验之链表四:有序链表的归并

数据结构实验之链表四:有序链表的归并 Time Limit: 1000MS Memory limit: 65536K 题目描述 分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据. 输入 第一行输入M与N的值: 第二行依次输入M个有序的整数: 第三行依次输入N个有序的整数. 输出 输出合并后的单链表所包含的M+N个有序的整数. 示例输入 6 5 1 23 26 45 66 99 14 21 28 5