表
表的简单数组实现:因为在定义表的时候因为表是动态空间所以会估计的大一点,从而浪费了大量的空间。在表的插入和删除的时候需要对表进行大量的遍历,所以一般不采用。
表的链表实现:链表由一系列不必在内存中相连的结构组成,每一个结构均含有表元素和指向包含该元素后继元的结构的指针。
表头所解决的三个问题:
- 不存在从所给定义出发在表的前面插入元素的真正显性的方法
- 从表的前面实行删除是以一个特殊的情况,因为要改变表的起始端,错误的操作会造成表的丢失
- 在删除算法中要求记住被删除元素前面的表元
free(P)的结果是:P正在指向的地址没有变,但是该地址处的数据此时已经无定义了。所以在撤除指针的工作结束后,就不能再引用它。
双链表:通过包含一个指向前一个单元的指针即可。使得插入和删除的空间开销增加了一倍,但是简化了删除操作。
循环链表:让最后一个单元反过来直接指向第一个单元,表头可有可无。并且还可以是双向链表(第一个单元的前驱元指针指向最后的单元)
链表的先关应用:多项式ADT、基数排序、多重表
链表的游标实现:因为缺少内存的管理,因此如果运行的Find函数相对很少时游标实现的速度会显著加快
链表的优点:插入快、删除快、动态的调整数据存储大小、空间利用率高
链表的缺点:查找慢
链表的相关操作:
list.h文件
#include <stdio.h>
#include <stdlib.h>
#ifndef _List_H
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
//清空链表并返回
List makeEmpty(List L);
//创建一个链表
List CreateList();
//判断一个链表是否是空表
int IsEmpty(List L);
//测试当前的位置是否是链表的末尾
int IsLast(Position P, List L);
//显示当前链表
void ShowList(List L);
//更改函数
void Change(int x,int y, Position P);
//Find函数
Position Find(int x, List L);
//插入函数
void Insert(int x, List L, Position P);
//删除函数
void Delete(int x, List L);
//返回表元的前驱
Position FindPrevious(int x , List L);
//删除链表函数
void DeleteList(List L);
//返回第一个元素
Position First(List L);
//返回表头
Position Header(List L);
//返回下一个元素
Position Advance(Position P);
//返回元素的值
int Retrieve(Position P);
#endif // _List_H
//定义节点类型
struct Node
{
int data;
Position Next;
};
list.c文件
#include "list.h"
int IsEmpty(List L){
return L->Next == NULL;
}
Position Find(int x,List L){
Position P = L->Next;
while(P != NULL && P->data != x){
P = P->Next;
}
return P;
}
Position FindPrevious(int x,List L){
Position P = L;
while(P->Next != NULL && P->Next->data != x){
P = P->Next;
}
return P;
}
void Insert(int x,List L,Position P){
Position TmpCell;
TmpCell = malloc( sizeof(struct Node));
if( TmpCell == NULL){
printf("Out of space!!");
}
TmpCell->data = x;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
void ShowList(List L){
L = L->Next;
while(L != NULL){
printf("data = %d \n",L->data);
L = L->Next;
}
printf("-------------------------- \n");
}
void Change(int x,int y,List L){
Position P;
P = Find(y,L);
if(P->data == y){
P->data = x;
}
}
int IsLast(Position P, List L){
return P->Next == NULL;
}
void Delete(int x,List L){
Position P,TmpCell;
P = FindPrevious(x,L);
if(!IsLast(P,L)){
TmpCell = P->Next;
P->Next = TmpCell->Next;
free(TmpCell);
}
}
List CreateList(){
List L = malloc(sizeof(struct Node));
L->Next = NULL;
return L;
}