数据结构——线性表

#include <stdio.h>  
#include <stdlib.h>  
  
#define TRUE 1  
#define FALSE 0  
#define OK 1  
#define ERROR 0  
#define INFEASIBLE -1  
#define OVERFLOW -2  
  
typedef int Status; //定义函数结果的状态码  
  
typedef int ElemType;  
  
//--------------线性表的动态分配存储结构-----------------------  
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量  
#define LISTINCREMENT 10 //线性表存储空间的分配增量  
  
typedef struct {  
ElemType * elem; //存储空间基址  
int length;  
int listsize; //当前分配的存储容量  
}SqList;  
  
  
//---------------顺序表的基本操作--------------------------------  
  
Status InitList(SqList &L);  
//操作结果:构造一个空的线性表L。  
  
Status DestroyList(SqList &L);  
//初始条件:线性表L已存在。  
//操作结果:销毁线性表L。  
  
Status ClearList(SqList &L);  
//初始条件:线性表L已存在。  
//操作结果:将L重置为空表。  
  
bool ListEmpty(SqList L);  
//初始条件:线性表L已存在。  
//操作结果:若L为空表,则返回TRUE,否则返回FALSE。  
  
int ListLength(SqList L);  
//初始条件:线性表L已存在。  
//操作结果:返回L中数据元素的个数。  
  
Status GetElem(SqList L, int i, ElemType &e);  
//初始条件:线性表L已存在,1<=i<=ListLength(L)。  
//操作结果:用e返回L中第i个数据元素的值。  
  
int LocateElem(SqList L, int e, bool (*equal)(ElemType, ElemType));  
//初始条件:线性表L已存在,compare()是数据元素判定函数。  
//返回L中第一个与e满足关系compare()的数据元素的位序。若这样的数据元素不存在,则返回值为0.  
  
Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e);  
//初始条件:线性表L已存在。  
//操作结果:若cur_e是L中的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。  
  
Status NextElem(SqList L, ElemType cur_e, ElemType &next_e);  
//初始条件:线性表L已存在。  
//操作结果:若cur_e是L中的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义。  
  
Status ListInsert(SqList &L, int i, ElemType e);  
//初始条件:线性表L已存在,1<=i<=ListLength(L)+1.  
//操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1.  
  
Status ListDelete(SqList &L, int i, ElemType &e);  
//初始条件:线性表L已存在且非空,1<=i<=ListLength(L).  
//操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1.  
  
Status ListTraverse(SqList L, bool (*visit)(ElemType));  
//初始条件:线性表L已存在  
//操作结果:依次对L的每个元素调用函数visit().一旦visit()失败,则操作失败。  
  void MergeList_Sq(SqList La,SqList Lb,SqList &Lc);
  
  
//---------------顺序表的功能实现---------------------------------  
Status InitList(SqList &L) //构造一个空的顺序表  
{  
L.elem=(ElemType*)malloc(LIST_INIT_SIZE* sizeof (ElemType));  
if (!L.elem) exit(OVERFLOW); //存储分配失败  
L.length=0; //空表长度为0  
L.listsize=LIST_INIT_SIZE; //初始存储容量  
return OK;  
}//InitList  
  
  
Status DestroyList(SqList &L) //线性表存在,销毁线性表  
{  
free(&L);  
return OK;  
}//DestroyList  
  
  
Status ClearList(SqList &L) //将L置为空表  
{  
L.length=0; //长度为0位空表  
return OK;  
}//ClearList  
  
  
bool ListEmpty(SqList L) //判断是否为空表,是返回true否返回false  
{  
if(!L.length) return TRUE;  
else  
return FALSE;  
}//ListEmpty  
  
  
int ListLength(SqList L) //返回线性表的长度即返回线性表数据元素个数  
{  
return L.length;  
}//ListLength  
  
  
Status GetElem(SqList L, int i, ElemType &e) //用e返回第i个元素的值  
{  
if (i<1||i>L.length) return ERROR; //判断输入是否合法  
e=L.elem[i-1];  
return OK;  
}//GetElem  
  
  
int LocateElem(SqList L, int e, bool (*equal)(ElemType, ElemType)) //返回L中第一个与e满足关系compare()的数据元素的位序  
{  
int i=1;  
while(i<=L.length && !(equal(L.elem[i-1],e))) ++i;  
if (i <= L.length) return i;  
else return 0;  
}//LocateElem  
  
  
Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e) //返回前驱  
{  
int i=1;   
while(i <= L.length && !(cur_e==L.elem[i-1])) ++i;   
if(i<2 || i>L.length)   
return ERROR;   
pre_e = L.elem[i-2];   
return OK;   
}//PriorElem  
  
  
Status NextElem(SqList L, ElemType cur_e, ElemType &next_e) //返回后继  
{  
int i=1;  
while(i <= L.length && !(cur_e==L.elem[i-1])) ++i;  
if(i>L.length-1)   
return ERROR;  
next_e = L.elem[i];  
return OK;  
}//NextElem  
  
  
Status ListInsert(SqList &L, int i, ElemType e) //在顺序表中第i个位置插入e,L的长度增加1  
{  
ElemType* p;  
ElemType* q;  
ElemType* newbase;  
if(i<1||i>L.length+1) return ERROR; //判断i的值是否合法  
if(L.length>=L.listsize)  
{  
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)* sizeof (ElemType));  
if (!newbase) exit(OVERFLOW);  
L.elem=newbase;  
L.listsize+=LISTINCREMENT;  
}  
q=&(L.elem[i-1]);  
for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;  
*p=e;  
++L.length;  
return OK;  
}//ListInsert  
  
  
Status ListDelete(SqList &L, int i, ElemType &e) //删除第i个元素,并返回e  
{  
ElemType* p,*q;  
if(i<1||i>L.length) return ERROR;   
p=&(L.elem[i-1]);  
e=*p;  
q=L.elem+L.length-1;  
for(++p;p<=q;++p) *(p-1)=*p;  
--L.length;  
return OK;  
}//ListDelete  
  
  
Status ListTraverse(SqList L, bool (*visit)(ElemType)) //对L中每个元素调用函数visit  
{  
int i=1;  
while (i<=L.length && (visit(L.elem[i-1]))) ++i;  
return OK;  
}  

github代码:https://github.com//badcyc/dataStruct

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,568评论 2 45
  • 数据结构-线性表 @(数据结构) 线性表是数据结构中的逻辑结构。可以存储在数组上,也可以存储在链表上。 顺序表(数...
    Rayhaha阅读 592评论 0 2
  • 恩...今天寻觅也没有找我。我路过他的试室都眼睛都没敢偷瞥了。我...也不知道为什么?总之就...害怕。 ...试...
    小棉袄呀阅读 411评论 0 0
  • 1.晋景公病重时做一恶梦,巫师预言他吃不上当年的新麦了。挨到六月的一天,景公突然想吃麦饭,令人献上新麦,并召巫师来...
    黄善卓阅读 677评论 1 4
  • 她是一个风筝,等待着我的抓紧,等待着放飞。我抓紧了,却抓的太紧了,我想,在放飞一点,就一点,却发现她乘风飞的却越来...
    暮友阅读 385评论 0 0