线性表的动态分配顺序存储结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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的前驱

相关文档
最新文档