您的位置:首页 > 编程语言 > C语言/C++

顺序线性表的存储与实现(C语言版)

2020-02-15 07:18 393 查看

代码实现

#include<stdio.h>//printf(),scanf()
#include<stdlib.h>//exit(),malloc()
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//Status,ElemType均是函数的类型
typedef int Status;
typedef int ElemType;
//线性表动态分配顺序存储结构
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分配增量
typedef struct {
ElemType *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
//操作结果:构造一个空的线性表L
Status InitList_Sq(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;
}
//初始条件:线性表L已存在
//操作结果:摧毁线性表L
Status DestroyList_Sq(SqList &L){
if(L.elem!=NULL){
free(L.elem);
L.length=0;
L.listsize=0;
printf("摧毁顺序线性表!\n");
}
return 0;
}
//初始条件:线性表L已存在
//操作结果:将L重置为空表
Status ClearList_Sq(SqList &L){
if(L.elem!=NULL){
L.length=0;
printf("置为空表!\n");
}
}
//初始条件:线性表L已存在
//操作结果:若L为空表,则返回TRUE,否则返回FALSE
Status ListEmpty_Sq(SqList L){
if(L.elem!=NULL&&L.length==0){
printf("空表!\n");
return TRUE;
}
else{
printf("非空表!\n");
return FALSE;
}
}
//初始条件:线性表L已存在
//操作结果:返回L中数据元素个数
int ListLength_Sq(SqList L){
if(L.elem!=NULL)
return L.length;
else
return ERROR;
}
//初始条件:线性单链表已存在,1<=i<=ListLength(L)
//操作结果:用e返回L中第i个数据元素的值
Status GetElem_Sq(SqList L,int i,ElemType &e){
if(ListEmpty_Sq(L))
return ERROR;
if(i<1||i>L.length){
printf("不存在第%d个元素!\n",i);
return ERROR;
}
e=L.elem[i-1];
return e;
}
Status compare(ElemType a,ElemType b){
if(a==b)
return TRUE;
return FALSE;
}
//初始条件:线性表L已存在
//操作结果:返回L中第1个与e满足关系compare{}的数据元素的位序,若这样的数据元素不存在,则返回值为0
int LocateElem_Sq(SqList L,ElemType e,Status (*compare)(ElemType,ElemType)){
int i=1;//i的初值为第1个元素的位序
ElemType *p=L.elem; //p的初值为第1个元素的存储位置
while(i<=L.length&&!(*compare)(*p++,e))++i;
if(i<=L.length)return i;
else return 0;
}
//初始条件:线性表L已存在
//操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
int PriorElem_Sq(SqList L,ElemType cur_e,ElemType &pre_e){
int i=2;
while(i<=L.length){
if(cur_e==L.elem[i-1]);{
pre_e=L.elem[i-2];
return OK;
}
i++;
}
return FALSE;
}
//初始条件:线性表L已存在
//操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义
int NextElem_Sq(SqList L,ElemType cur_e,ElemType &next_e){
int i=1;
while(i<L.length){
if(cur_e==L.elem[i-1]);{
next_e=L.elem[i];
return OK;
}
i++;
}
return FALSE;
}
//初始条件:线性表L已存在,1<=i<=listlength(L)+1
//操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
Status  ListInsert_Sq(SqList &L,int i,ElemType e){
if(i<1||i>L.length+1) return ERROR;//i值不合法
if(L.length>=L.listsize){//当前存储空间已满,增加分配
ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);//存储分配失败
L.elem=newbase;//新基址
L.listsize+=LISTINCREMENT;//增加存储容量
}
ElemType *q=&(L.elem[i-1]);//q为插入位置
for(ElemType *p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;//插入位置及之后的元素右移
*q=e;//插入e
++L.length;//表长增1
return OK;
}
//初始条件:线性表L已存在,1<=i<=ListLength(L)
//操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
Status ListDelete_Sq(SqList &L,int i,ElemType &e){
if(i<1||i>L.length)return ERROR;//i值不合法
ElemType *p=&(L.elem[i-1]);//p为被删除元素的位置
e=*p;//被删除元素的值赋给e
ElemType *q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p)
*(p-1)=*p;//被删除元素之后的元素左移
--L.length;
return OK;
}
Status visit(ElemType e){
printf("%d ",e);
return true;
}
//初始条件:线性表L已存在
//操作结果:依次对L的每个数据元素调用函数visit(),一旦visit()失败,则操作失败
Status ListTraverse_Sq(SqList L,Status (*visit)(ElemType)){
int i=1;
ElemType *p=L.elem;
while(i<=L.length&&(*visit)(*p++))++i;
return OK;
}
int main(){
SqList  L;
ElemType e,pre_e,next_e;
InitList_Sq(L);
ListInsert_Sq(L,1,3);
ListInsert_Sq(L,2,7);
ListInsert_Sq(L,3,9);
ListInsert_Sq(L,4,1);
ListInsert_Sq(L,5,44);
ListInsert_Sq(L,6,15);
ListTraverse_Sq(L,visit);
printf("\n");
printf("List length is %d\n",ListLength_Sq(L));
printf("第5个数为: %d\n",GetElem_Sq(L,5,e));
e=15;
printf("15所在的位置为: %d\n",LocateElem_Sq(L,15,compare));
PriorElem_Sq(L,e,pre_e);
NextElem_Sq(L,e,next_e);
printf("e的前驱为: %d,  后继为: %d\n",pre_e,next_e);
ListDelete_Sq(L,3,e);
printf("所删除的值为: %d\n",e);
printf("遍历: ");
ListTraverse_Sq(L,visit);
printf("\n");
ListEmpty_Sq(L);
ClearList_Sq(L);
ListEmpty_Sq(L);
DestroyList_Sq(L);
return 0;
}

运行结果

  • 点赞
  • 收藏
  • 分享
  • 文章举报
向着太阳,向着光 发布了4 篇原创文章 · 获赞 0 · 访问量 49 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: