在C++的编译环境下运行(部分代码使用到 & 引用符, & 可以修改数据)
// 准备
//----------
#include <iostream>
#include <stdio.h>
#include <malloc.h>
using namespace std;
//----------
//status类型(int)返回值为函数结果代码,便与描述
#define Status int
#define error -1
#define overlow -1
#define ok 1
//----------
// Linklist 顺序线性表的一些基本属性
#define list_init_size 2 //存储空间初始分配量
#define list_createment 1 //存储空间分配增量
#define Elemtype int // 数据类型定位 int 型
typedef struct {
Elemtype * elem; //存储空间基址,即首地址,后面存储数据
int length; // 当前长度
int listsize; // 分配的存储容量
}Sqlist;
//----------基本操作
// 顺序表的创建
Status lis_create (Sqlist &L){
L.elem=(Elemtype *) malloc(list_init_size*sizeof (Elemtype));
if (!L.elem) return error;
L.length=0; //空表长度为0
L.listsize=list_init_size; //初始存储容量
return ok;
}
// 顺序表的遍历
Status lis_loading (Sqlist L){ //不用&符,不修改数据
int i;
printf("your list:");
for (i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("\n");
return ok;
}
// 顺序表的插入 (表,插在第i的位置前插入e;
Status lis_insert(Sqlist &L, int i, Elemtype e) {
Elemtype *newbase,*q,*p;
if (i<1||i>L.length+1) return error;//i值不合法
if (L.length>=L.listsize){
newbase=(Elemtype *) realloc (L.elem,(L.listsize+list_createment)*sizeof(Elemtype));//存储空间不足时增分配
if (!newbase ) return (overlow);
L.elem=newbase;
L.listsize+=list_createment;// 存储容量增加
} //插入
q=&(L.elem[i-1]); //q为插入位置
for(p=L.elem+L.length-1;p>=q;--p)//插入位置及之后的元素右移
*(p+1)=*p;
*q=e; //插入e
++L.length; //表长增加
return ok;
}
//表的删除 (表,删除的位置,删除元素返回到e
Status lis_delete (Sqlist &L,int i,Elemtype e){
Elemtype *q,*p;
if ((i<1)||(i>L.length)) return error;//i值不合法
p=&(L.elem[i-1]); //被删除元素的位置
e=*p; //被删除元素返回给e
q=L.elem+L.length-1; //表尾
for(p=&(L.elem[i-1]);p<=q;++p) //被删除元素之后左移
*p=*(p+1);
--L.length; //表长减一
return ok;
}
//具体实现
int main()
{
Sqlist T;
int n,i;
Elemtype x;
printf("__________________________________________\n");
//表的创建 输出创建的结果
if (!lis_create(T)) printf("create a list defeat \n");
printf("create a list succseefully \n");
printf("(1):insert a elment ,input situation and element \n(2):delete a elment,input situation\n(3):load the whole list\n(0):exit\n");
printf("__________________________________________\n");
while (1)
{
scanf("%d",&n);
switch (n)
{
//插入
case 1:scanf("%d%d",&i,&x);
if (!lis_insert(T,i,x)) printf("insert error\n");
else printf("the element %d is successfully insert \n",x);
break;
//删除
case 2: scanf("%d",&i);
if (!lis_delete(T,i,x)) printf("Delete error\n");
else printf("the elemeng %d is successfully delete \n",x);
break;
//遍历
case 3:lis_loading(T);
break;
case 0: return 1; //return1,return给主函数 主函数结束
}
}
}