线性表的动态分配顺序存储结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
util.h
//通用头文件:存放公共函数或变量
#include "stdio.h"
#include "stdlib.h"
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 2
#define ERROR -1
#define INFEASIBLE -2 //不可行
#define OVERFLOW -3
//声明函数返回值的数据类型
typedef int Status;
//声明线性表中元素的数据类型
typedef int ElemType;
//声明相关辅助函数
Status Compare(ElemType,ElemType);
void Vist(ElemType);
//声明函数指针
typedef Status (*pCompare)(ElemType,ElemType);
typedef void (*pVisit)(ElemType);
u.til.cpp
//通用函数的定义
#include "util.h"
Status Compare(ElemType e1,ElemType e2)
{//操作结果:比较e1和e2是否相等。若相等,则返回TRUE;否则返回FALSE if(e1==e2)
return TRUE;
else
return FALSE;
}//Compare
void Visit(ElemType e)
{//操作结果:在屏幕上输出e
printf("%d ",e);
}//Visit
SqList.h
//顺序表头文件
#include "util.h"
//线性表的动态分配顺序存储结构
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量#define LISTINCREMENT 10 //线性表存储空间的分配增量typedef struct{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量
}SqList;
//顺序表的基本操作
Status InitList_Sq(SqList&);
Status DestroyList_Sq(SqList&);
//声明顺序表的引用型操作
Status ListEmpty_Sq(SqList);
int ListLength_Sq(SqList);
ElemType PriorElem_Sq(SqList,ElemType,ElemType&); ElemType NextElem_Sq(SqList,ElemType,ElemType&); ElemType GetElem_Sq(SqList,int,ElemType&);
int LocateElem_Sq(SqList,ElemType,pCompare);
void ListTraverse_Sq(SqList,pVisit);
//声明顺序加工型操作
Status ClearList_Sq(SqList&);
Status PutElem(SqList&,int,ElemType);
Status ListInsert_Sq(SqList&,int,ElemType);
Status ListDelete_Sq(SqList&,int,ElemType&);
void Union(SqList&,SqList);
void Purge(SqList&,SqList);
void MergeList_Sq(SqList,SqList,SqList&);
SqList.cpp
//顺序表的操作
#include "SqList.h"
//顺序表的基本操作
Status InitList_Sq(SqList &L)
{ //操作结果:构造一个空线性表L
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
//申请分配存储空间if(!L.elem) exit(OVERFLOW); //存储分配失败
L.length=0; //顺序表长度初始化为0
L.listsize=LISTINCREMENT; //当前存储容量大小为INCREMENT return OK;
}//InitList_Sq
Status DestroyList_Sq(SqList &L)
{
//初始条件:顺序表L存在
//操作结果:销毁顺序表L
if(!L.elem) exit(ERROR); //顺序表不存在,函数调用失败
free(L.elem); //释放存储空间
L.length=0;
L.listsize=0;
L.elem=NULL;
return OK;
}//DestroyList_Sq
//顺序表的引用型操作
Status ListEmpty_Sq(SqList L)
{
//初始条件:顺序表L存在
//操作结果:查看顺序表L是否为空表,是则返回TRUE;反之返回FALSE
if(!L.elem) exit(ERROR); //顺序表不存在,函数调用失败
if(L.length==0)
return TRUE;
else
return FALSE;
}//ListEmpty_Sq
int ListLength_Sq(SqList L)
{
//初始条件:顺序表L存在
//操作结果:返回顺序表长度
if(!L.elem) exit(ERROR); //顺序表不存在,函数调用失败
return L.length;
}//ListLength_Sq
ElemType PriorElem_Sq(SqList L,ElemType cur_e,ElemType &pre_e)
{
//初始条件:顺序表L存在
//操作结果:若cur_e在顺序表中,且不是第一个元素,则用pre_e返回其前驱// 否则操作不可行
int pos=2; //cur_e当前位置pos≥2
if(!L.elem) exit(ERROR); //顺序表不存在,函数调用失败
ElemType *p=L.elem+1; //从顺序表第2个位置查找cur_e
while(pos++<=L.length&&(*p++)!=cur_e); //pos范围2≤pos≤L.Length
if(pos>L.length) return INFEASIBLE; //到表结束未找到cur_e,操作不可行
else{
pre_e=(*--p); //pre_e为当前值cur_e的前驱
return pre_e; //返回前驱pre_e
}
}//PriorElem_Sq
ElemType NextElem_Sq(SqList L,ElemType cur_e,ElemType &next_e)
{
//初始条件:顺序表L存在
//操作结果:若cur_e在顺序表中,且不是最后一个元素,则用next_e返回其后继// 否则操作不可行
int pos=1; //cur_e当前位置pos≥2
if(!L.elem) exit(ERROR); //顺序表不存在,函数调用失败
ElemType *p=L.elem; //从顺序表第1个位置查找cur_e
while(pos++ if(pos==L.length) return INFEASIBLE; //到表尾未找到cur_e,操作不可行 else{ next_e=(*++p); //pre_e为当前值cur_e的前驱