线性表
抽象数据类型线性表的定义如下:
ADT List
{
数据对象:D={ai|ai属于ElemSet,i,2,3…,n,n>=0}
数据关系:R1={<a(i-1),a(i)>|a(i),a(i-1)属于D,i=1,2,…n}
基本操作:
InitList(&L)
操作结果:构造一个空的线性表。
DestroyList(&L)
初始条件:线性表已经存在。
操作结果:销毁线性表。
ClearList(&L)
初始条件:线性表已经存在。
操作结果:将L重置为空表。
ListEmpty(L)
初始条件:线性表已经存在。
操作结果:若表L为空返回TRUE,否则返回FALSE。
ListLength(L)
初始条件:线性表已经存在。
操作结果:返回数据中元素的个数。
GetElem(L,i,&e)
初始条件:线性表已经存在,1<=i<=Listlength(L);
操作结果:用e返回第i个元素的值。
LocateElem(L,e,compare())
初始条件:线性表已经存在,compare是元素判定函数。
操作结果:返回L中第一个与e满足关系compare的数据元素的位序,若这样的元素不存在,则返回值为0;
PriorElem(L,cur_e,&pre_e)
初始条件:线性表已存在。
操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作结果失败,pre_e无定义。
NextElem(L,cur_e,&next_e)
初始条件:线性表已经存在。
操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作结果失败,next_e无定义。
ListInsert(&L,cur_e,&next_e)
初始条件:线性表已经存在,1<=i<=ListLength(L)+1;
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1.
ListDelete(&L,i,&e)
初始条件:线性表已经存在且非空,1<=i<=ListLength(L)
操作结果:删除L的第i个元素,并用e返回其值,L的长度减一
ListTraverse(L,visit())
初始条件:线性表已经存在
操作结果:依次对每个元素调用visit,一旦visit失败,则操作失败
}ADT List;
费力写下上面的抽象数据类型的定义,只是想说明一个问题:
在利用抽象数据类型描述线性表时候,不管其中的存储方式是什么样的,抽象数据类型提供的函数都是一样的,且功能一样。这种封装使得我们能够轻松的编程。
我们也用c++的理由是:
(1)只关注统一的封装接口
(2)只关注算法
(3)不必关心具体语法,c++的语言表达性更强。注意在本文中函数 命名是以大写开头的
于是利用上述的函数,不需要考虑具体细节就能实现的函数有(比较顺序表与链表用该函数写是否需要区别对待)
(1)LocateElem(L,e,compare())函数,
注意函数实现时候的语法!
#include <unistd.h>
#include <stdio.h>
typedef int Status;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int ElemType;
//List表示线性表类型在此未定义
Status GetElem(List L,int i,ElemType &c);//函数i满足条件下返回OK,否则放回ERROR
int ListLength(List L);//函数返回L的长度
//参数满足compare函数,函数返回0;否则返回1或者-1;