第三章 表、栈和队列
一、 引言
本章介绍最简单和最基本的三种数据结构:表、栈和队列。
二、 抽象数据类型
抽象数据类型(abstract data type, ADT)是一些操作的集合。
三、 表 ADT
表指的是具有一对一关系的数据所组成的数据结构。称大小为0的表为空表。
1、表的简单数组实现
对表的所有操作都可以通过使用数组来实现。
局限:存在许多未知大小的表的情况下,需要对表的大小的最大值进行估计,会浪费大量的空间。
2、链表
链表由一系列不必在内存中相连的结构组成。每一个结构均含有表元素和指向包含该元素后继元结构的指针,称之为 N e x t Next Next指针。最后一个单元的 N e x t Next Next指针指向 N U L L NULL NULL。
(1)从链表中删除:
(2)向链表中插入:
3、程序设计的细节
标志结点,称为表头或者哑结点。
(1)判断一个链表是否是空表的函数
/* Return true if L is empty */
int IsEmpty(List L)
{
return L->Next == NULL:
}
(2)判断当前位置是否是链表的末尾的函数
/*Return true if P is the last position in list L*/
int IsLast(Position P, List L)
{
return P->Next == NULL;
}
(3)Find例程
/*Return Position of X in L; NULL if not found*/
Position Find(ElementType X, List L)
{
Position P;
P = L->Next;
while(P != NULL && P->Element != X)
P = P->Next;
return P;
}
(4)FindPrevious例程(与Delete一起使用的Find例程)
/*If X is not found, then next field of returned*/
Position FindPrevious( ElementType X, List L)
{
Position P;
P = L;
while( P->Next != NULL && P->Next->Element != X )
P = P->Next;
return P;
}
(5)链表的删除例程
/*Delete first occurrence of X from a list*/
void Delete( ElementType X, List L)
{
Position P, TmpCell;
P = FindPrevious( X, L );
if(!IsLast( P, L))
{
TmpCell = P->Next;
P->Next = TmpCell ->Next;
free( TmpCell );
}
}
(6)链表的插入例程
void Insert( ElementType X, List L, Position P )
{
Position TmpCell;
TmpCell = malloc( sizeof(struct Node) );
if(TmpCell == NULL)
{
FatalError("Out of space!!!");
}
TmpCell->Element =