【数据结构与算法分析】 第三章 表
1.抽象数据类型
抽象数据类型(ADT)是一些操作的集合。
对表、集合、图和他们的操作一起可以看作是抽象数据类型,就像整数、实数和布尔量是数据类型一样。对于集合ADT,可以有并、交、测定大小及取余等操作。或者只要两种操作:并和查找,这两种操作又在该集合上定义了一种不同的ADT
2.表ADT
在表ADT上运行的操作的集合:
PrintList和MakeEmpty,打印和清空表
Find返回关键字首次出现的位置
Insert和Delete从表的某个位置插入和删除某个关键字
FindKth返回某个位置上(作为参数而被指定)的元素
2.1链表
为了避免插入和删除的线性开销,需要允许表可以不连续存储,否则表的部分或全部需要整体移动,因此产生了链表
链表由一系列不必再内存中相连的结构组成,每一个结构均含有表元素和指向包含该元素后继元的结构的指针,即next指针,最后一个单元的next指针指向NULL
删除链表中元素:
向链表插入元素:
2.2程序设计
实际程序设计中,常需要引入表头,表头在位置0处,方便程序编写:
链表的类型声明:
#ifndef _List_H
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
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);
#endif
struct Node
{
ElementType Element;
Position Next;
}
测试一个链表是否是空表的函数:
int IsEmpty(List L)
{
return L->Next==NULL;
}
Find函数:
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,Temp;
P=FindPrevious(X,L);
if(!=IsLast(P,L))
{
Temp=P->Next;
P->Next = Temp->Next;//修改链表,指向下一个位置
free(Temp);//释放内存
}
}
Position FindPrevious(ElementType X,List L)//找出X元素的前一个位置
{
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 Temp;
Temp = malloc(sizeof(struct Node));
if(Temp==NULL)
FatalError("out of space");
Temp->Element = X;
Temp->Next = P->Next;
P->Next = Temp;
}
删除表:
void DeleteList(List L)
{
Position P,Temp;
P=L->Next;
L->Next = NULL;
while(P!=NULL)
{
Temp = P->Next;
free(P);
P=Temp;
}
}