链表ADT的实现

list.h文件

 1         typedef int ElementType;
 2
 3 /* START: fig3_6.txt */
 4         #ifndef _List_H
 5         #define _List_H
 6
 7         struct Node;
 8         typedef struct Node *PtrToNode;
 9         typedef PtrToNode List;
10         typedef PtrToNode Position;
11
12         List MakeEmpty( List L );
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    /* _List_H */
26 /* END */

list.c文件

  1         #include "list.h"
  2         #include <stdlib.h>
  3         #include "fatal.h"
  4
  5         /* Place in the interface file */
  6         struct Node
  7         {
  8             ElementType Element;
  9             Position    Next;
 10         };
 11
 12         List
 13         MakeEmpty( List L )
 14         {
 15             if( L != NULL )
 16                 DeleteList( L );
 17             L = malloc( sizeof( struct Node ) );
 18             if( L == NULL )
 19                 FatalError( "Out of memory!" );
 20             L->Next = NULL;
 21             return L;
 22         }
 23
 24 /* START: fig3_8.txt */
 25         /* Return true if L is empty */
 26
 27         int
 28         IsEmpty( List L )
 29         {
 30             return L->Next == NULL;
 31         }
 32 /* END */
 33
 34 /* START: fig3_9.txt */
 35         /* Return true if P is the last position in list L */
 36         /* Parameter L is unused in this implementation */
 37
 38         int IsLast( Position P, List L )
 39         {
 40             return P->Next == NULL;
 41         }
 42 /* END */
 43
 44 /* START: fig3_10.txt */
 45         /* Return Position of X in L; NULL if not found */
 46
 47         Position
 48         Find( ElementType X, List L )
 49         {
 50             Position P;
 51
 52 /* 1*/      P = L->Next;
 53 /* 2*/      while( P != NULL && P->Element != X )
 54 /* 3*/          P = P->Next;
 55
 56 /* 4*/      return P;
 57         }
 58 /* END */
 59
 60 /* START: fig3_11.txt */
 61         /* Delete from a list */
 62         /* Cell pointed to by P->Next is wiped out */
 63         /* Assume that the position is legal */
 64         /* Assume use of a header node */
 65
 66         void
 67         Delete( ElementType X, List L )
 68         {
 69             Position P, TmpCell;
 70
 71             P = FindPrevious( X, L );
 72
 73             if( !IsLast( P, L ) )  /* Assumption of header use */
 74             {                      /* X is found; delete it */
 75                 TmpCell = P->Next;
 76                 P->Next = TmpCell->Next;  /* Bypass deleted cell */
 77                 free( TmpCell );
 78             }
 79         }
 80 /* END */
 81
 82 /* START: fig3_12.txt */
 83         /* If X is not found, then Next field of returned value is NULL */
 84         /* Assumes a header */
 85
 86         Position
 87         FindPrevious( ElementType X, List L )
 88         {
 89             Position P;
 90
 91 /* 1*/      P = L;
 92 /* 2*/      while( P->Next != NULL && P->Next->Element != X )
 93 /* 3*/          P = P->Next;
 94
 95 /* 4*/      return P;
 96         }
 97 /* END */
 98
 99 /* START: fig3_13.txt */
100         /* Insert (after legal position P) */
101         /* Header implementation assumed */
102         /* Parameter L is unused in this implementation */
103
104         void
105         Insert( ElementType X, List L, Position P )
106         {
107             Position TmpCell;
108
109 /* 1*/      TmpCell = malloc( sizeof( struct Node ) );
110 /* 2*/      if( TmpCell == NULL )
111 /* 3*/          FatalError( "Out of space!!!" );
112
113 /* 4*/      TmpCell->Element = X;
114 /* 5*/      TmpCell->Next = P->Next;
115 /* 6*/      P->Next = TmpCell;
116         }
117 /* END */
118
119 #if 0
120 /* START: fig3_14.txt */
121         /* Incorrect DeleteList algorithm */
122
123         void
124         DeleteList( List L )
125         {
126             Position P;
127
128 /* 1*/      P = L->Next;  /* Header assumed */
129 /* 2*/      L->Next = NULL;
130 /* 3*/      while( P != NULL )
131             {
132 /* 4*/          free( P );
133 /* 5*/          P = P->Next;
134             }
135         }
136 /* END */
137 #endif
138
139 /* START: fig3_15.txt */
140         /* Correct DeleteList algorithm */
141
142         void
143         DeleteList( List L )
144         {
145             Position P, Tmp;
146
147 /* 1*/      P = L->Next;  /* Header assumed */
148 /* 2*/      L->Next = NULL;
149 /* 3*/      while( P != NULL )
150             {
151 /* 4*/          Tmp = P->Next;
152 /* 5*/          free( P );
153 /* 6*/          P = Tmp;
154             }
155         }
156 /* END */
157
158         Position
159         Header( List L )
160         {
161             return L;
162         }
163
164         Position
165         First( List L )
166         {
167             return L->Next;
168         }
169
170         Position
171         Advance( Position P )
172         {
173             return P->Next;
174         }
175
176         ElementType
177         Retrieve( Position P )
178         {
179             return P->Element;
180         }
时间: 2024-10-09 20:42:24

链表ADT的实现的相关文章

《数据结构与算法分析》学习笔记(三)——链表ADT

今天简单学习了下链表,待后续,会附上一些简单经典的题目的解析作为学习的巩固 首先要了解链表,链表其实就是由一个个结点构成的,然后每一个结点含有一个数据域和一个指针域,数据域用来存放数据,而指针域则用来存放下一个结点的地址. 1.先给出结点的定义. typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; struct Node { ElementType Element; Positio

数据结构---链表ADT C++实现

最近在学习数据结构,刚开始一直在看书,但是总是感觉似懂非懂,心想还不如自己操练一波,势必有所收获.现将实现代码发表此地,以备日后复习,同时由于本人C++基础薄弱,若有错误或者建议,欢迎告知本人! 1. 节点类 1 class Node { 2 public: 3 int data; 4 Node *next; 5 Node(int da): 6 data(da), next(NULL){} 7 }; 这里节点类的定义采用大多数刷题网站的模版(当然,也可以使用 struct ) 2. 链表类ADT

链表ADT实现

LIST.H #ifndef LIST_H_#define LIST_H_#include<stdbool.h>#define TSIZE 45struct film{ char title[TSIZE]; int rating;}; typedef struct film Item;typedef struct node{ Item item; struct node *next;}Node; typedef Node * List; void InitializeList(List *pl

数据结构与算法分析 - 1 - 链表ADT

1.描述:不连续存储的表,可以把链表看成一个数组,数组元素是一个个结构体,这些结构体之间通过指针连接 2.优点: 利用不连续的存储空间,提高内存使用效率 避免删除和插入的线性开销 对比数组,大小不固定,可以扩展 3. 缺点:查找效率低 4. 定义一个单向链表 1 struct Node 2 { 3 ElementType value; 4 Node *next; //next指针,指向下一个节点 5 }; 5.检测链表是否为空 对于一个单向链表,链表为空即头节点为空 1 int IsEmpty(

C 链表 &nbsp;

链表ADT操作的代码实现 struct list *create_list()//创建一个节点,返回值为list结构体指针 void traverse(struct list *ls) //遍历链表 struct list *insert_list(struct list *ls,int n,int data) //在指定位置插入元素,(首节点,在第几个节点插入,这个节点的data值) int delete_list(struct list *ls,int n) //删除链表元素,1链表首元素,

【练习题】编写打印出一个单链表的所有元素的程序【链表】

只是实现了链表ADT的部分功能. /*---编写打印出一个单链表的所有元素的程序---*/ #include <stdio.h> #include <stdlib.h> struct Node{ int val; struct Node *next; }; Node *findEnd(Node *list){ while(list->next) list = list->next; return list; } void insert(int val, Node *li

数据结构与算法学习02:链表

一.链表 链表是一种动态集合,它是由一系列元素组成的一个列表. 数组也可以实现列表这种数据结构,但数组是静态的,而链表是动态. 通常,我们定义一个结点类(或结构体)来表示链表的元素,它由两部分组成:数值域和指针域.数值域存储当前结点的键,指针域存储下一个节点的地址. template <class Type> struct nodeType { Type info; nodeType<Type> *link; }; 链表的一些基本操作如下: 初始化为空表 判断是否为空 打印(遍历)

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

这篇文章主要是根据<数据结构与算法分析--C语言描述>一书的链表章节内容所写,该书作者给出了链表ADT的一些方法,但是并没有给出所有方法的实现.在学习的过程中将练习的代码记录在文章中,并添加了一些在测试中需要的函数,因此可能看起来会有点乱... 首先,链表作为一种简单的线性数据结构,主要特征就是"节点",每个节点包含两个信息,一个是数据域,另外一个是指针域.数据是我们在程序中需要用到的数据,数据类型可以变化,根据需要设定即可,但是指针域就是一个指针,主要作用是指向下一个节点

【WIP_S3】链表

创建: 2017/12/26 [TODO]     S4, S5, S14来处理动态数组   CAF8A81B790F [github 地址]传送门  链表的定义  定义  存储大量数据的数据结构  性质  ● 相邻元素用指针连接 ● 最后的要素指向NULL ● 程序运行时动态调整大小(size) ● (在计算机内存范围内)能获取需要的长度 ● 不浪费内存空间(但是指针需要多余的内存)              链表ADT  链表的主要运算  ● 插入: 插入元素 ● 删除: 删除指定位置的元素