#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
//定义各种状态
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2
//线性表存储空间的初始量和增量
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
//约定状态和元素类型
typedef int Status;
typedef int ElemType;
//顺序方式存储的结构体
typedef struct {
ElemType * elem;
int length;
int listsize;
}SqList,*SqListPtr;
Status InitList(SqListPtr L);
Status DestroyList(SqListPtr L);
Status ClearList(SqListPtr L);
Status ListEmpty(SqList L);
int ListLength(SqList L);
void GetElem(SqList L,int i,ElemType* e);
Status compare(ElemType e1,ElemType e2);
int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType));
Status PriorElem(SqList L,ElemType cur_e,ElemType* pre_e);
Status NextElem(SqList L,ElemType cur_e,ElemType* next_e);
Status ListInsert(SqListPtr L,int i,ElemType e);
Status ListDelete(SqListPtr L,int i,ElemType* e);
Status visit(ElemType e);
Status ListTraverse(SqList L,Status(*visit)(ElemType));
int main()
{
int i,e;
SqList slist;
InitList(&slist);
for(i=0;i<5;i++){
slist.elem[i]=i+1;
slist.length=5;
}
//测试区
for(i=0;i<slist.length;++i){
printf("%d ",slist.elem[i]);
}
printf("\n");
return 0;
}
Status InitList(SqListPtr L){
//构造一个空表
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)
return OVERFLOW;
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}//InitList
Status DestroyList(SqListPtr L){
//销毁线性表
free(L->elem);
L->listsize=0;
L->length=0;
L->elem=NULL;
return OK;
}//DestroyList
Status ClearList(SqListPtr L){
//重置线性表为空表
if(!(L->elem=(ElemType *)realloc(L->elem,LIST_INIT_SIZE*sizeof(ElemType))))
return ERROR;
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}//ClearList
Status ListEmpty(SqList L){
//判断是否为空表
if(L.length==0){
return TRUE;
}
return FALSE;
}//ListEmpty
int ListLength(SqList L){
//返回线性表的长度
return L.length;
}//ListLength
void GetElem(SqList L,int i,ElemType* e){
//返回指定位置的元素
*e = L.elem[i-1];
}//GetElem
Status compare(ElemType e1,ElemType e2){
if(e1==e2)
return TRUE;
else
return FALSE;
}//compare
int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)){
int i=1;
ElemType * p=L.elem;
while(i<=L.length&&!(*compare)(*p++,e))
++i;
if(i<=L.length)
return i;
else
return 0;
}//LocateElem
Status PriorElem(SqList L,ElemType cur_e,ElemType* pre_e){
//返回已存在元素的前一个元素
int i;
for(i=1;i<L.length;i++){
if(cur_e==L.elem[i]){
*pre_e=L.elem[i-1];
return TRUE;
}
}
*pre_e=NULL;
return FALSE;
}//PriorElem
Status NextElem(SqList L,ElemType cur_e,ElemType* next_e){
//返回已存在元素的下一个元素
int i;
for(i=0;i<L.length-1;i++){
if(cur_e==L.elem[i]){
*next_e=L.elem[i+1];
return TRUE;
}
}
*next_e=NULL;
return FALSE;
}//NextElem
Status ListInsert(SqListPtr L,int i,ElemType e){
//在线性表指定位置插入新的数据元素
ElemType * p,* q;
if(i<1||i>L->length+1)
return ERROR;
if(L->length>=L->listsize){
SqListPtr newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
return 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;
}
*q=e;
++L->length;
return OK;
}//ListInsert
Status ListDelete(SqListPtr L,int i,ElemType* 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;
p++;
for(p;p<=q;++p)
*(p-1)=*p;
--L->length;
return OK;
}//ListDelete
Status visit(ElemType e){
if(e%2==0)
return TRUE;
return FALSE;
}//visit
Status ListTraverse(SqList L,Status(*visit)(ElemType)){
//遍历访问
int i;
for(i=0;i<L.length;i++){
if(!(*visit)(L.elem[i]))
return FALSE;
}
return TRUE;
}//ListTraverse
数据结构复习之顺序方式存储的线性表实现
最新推荐文章于 2021-01-09 19:14:31 发布