C语言实现顺序表
程序员文章站
2022-07-15 09:13:46
...
数据结构顺序表的简单实现
最近复习了一下数据结构对顺序表进行一下复习!
结构的定义
#include<stdio.h>
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
#define NMAX 100
typedef int ElemType; //定义元素类型
typedef struct sqlist{
ElemType elements[NMAX];
int length;
}SqList, *PSqList;
函数定义
//定义函数
Status InitList(PSqList &L); //初始化
Status DestroyList(PSqList &L); //销毁
int LengthList(PSqList L); //求长度
Status ListEmpty(PSqList L); //判断表空
int LocateElem(PSqList L, ElemType e); //按元素值查找
Status DisplayList(PSqList L); //输出表
Status GetElem(PSqList L, int i, ElemType &e); //求某个数据元素值
//Status GetElem(PSqList L, int i, ElemType *e); 一样的
Status ListInsert(PSqList &L, int i, ElemType e); //插入数据元素
Status ListDelete(PSqList &L, int i, ElemType &e); //删除数据元素
函数实现
- 函数的实现比较简单
Status InitList(PSqList &L){ //初始化
L->length = 0;
return OK;
}
Status DestroyList(PSqList &L){ //销毁
//这个内存空间是系统分配的,系统会自动收回
}
int LengthList(PSqList L){ //求长度
return L->length;
}
Status ListEmpty(PSqList L){ //判断表空
return (L->length == 0);
}
int LocateElem(PSqList L, ElemType e){ //按元素值查找
if(ListEmpty(L)) return ERROR;
int i;
while(i <= L->length && L->elements[i] != e){
i++;
}
if(i > L->length)
return ERROR;
return i;
}
Status DisplayList(PSqList L){ //输出表
if(ListEmpty(L)) return ERROR;
for(int i = 1; i <= L->length; i++){
printf("%2d ",L->elements[i]);
if(i % 10 == 0) printf("\n");
}
printf("\n");
return OK;
}
Status GetElem(PSqList L, int i, ElemType &e){ //求某个数据元素值 1=< i <= LengthList(L)
if(i < 1 || i > L->length) return ERROR;
e = L->elements[i];
return OK;
}
Status ListInsert(PSqList &L, int i, ElemType e){ //插入数据元素 1=< i <= LengthList(L)+1
if(L->length == NMAX) return -1; // 表满
if(i < 1 || i > L->length+1) return -2; // i 值不合理
for(int j = L->length; j >= i; j--){
L->elements[j+1] = L->elements[j]; //元素后移
}
L->elements[i] = e; //插入元素
L->length++; //表长度加 1
return OK;
}
Status ListDelete(PSqList &L, int i, ElemType &e){ //删除数据元素 1=< i <= LengthList(L)
if(L->length == 0) return ERROR; //表空返回错误
if(i < 1 || i > L->length+1) return -2; // i 值不合理
for(int j = i; j <= L->length; j++){
L->elements[j] = L->elements[j+1]; //元素前移
}
L->length--;
return OK;
}
主函数
- 主函数的测试代码部分
int main(){
SqList L;
PSqList PL = &L; //指针类型绑定内存空间
InitList(PL);
ElemType e;
printf("初始化顺序表:\n");
printf("表长:%d\n",LengthList(PL));
ListEmpty(PL) == 1?printf("表空\n"):printf("表不空\n");
printf("插入数字 1-50:\n");
for(int i = 1; i <= 50; i++){
e = i;
ListInsert(PL,i,e);
}
printf("表长:%d\n",LengthList(PL));
ListEmpty(PL) == 1?printf("表空\n"):printf("表不空\n");
printf("输出顺序表:\n");
DisplayList(PL);
printf("在第1位插入9,10位插入数字99,51位插入999\n");
ListInsert(PL, 1, 9);
ListInsert(PL, 10, 99);
ListInsert(PL, 51, 999);
printf("输出顺序表:\n");
printf("表长:%d\n",LengthList(PL));
DisplayList(PL);
printf("\n删除第51位,删除第10位,删除第1位\n");
ListDelete(PL, 51, e);
ListDelete(PL, 10, e);
ListDelete(PL, 1, e);
printf("表长:%d\n",LengthList(PL));
printf("输出顺序表:\n");
DisplayList(PL);
return 0;
}
总结
顺序表的实现还是比较简单,相对于链式结构还是简单许多,我这个代码基本上实现了顺序表的若干操作,比较简陋。相信只要努力,以后一定能写出来更好的代码。