- 顺序表的类型定义和基本操作算法实现
#include <stdio.h>
#include <malloc.h>
#define listinitsize 100
#define listincrement 10
#define ERROR 0
#define OK 1
typedef int Elemtype;
typedef int Status;
Elemtype newbase;
typedef struct{
Elemtype *elem;
int length;
int listsize;
}sqlist;
//创建一个顺序表
Status Initlist(sqlist *L){
L->elem=(Elemtype *)malloc(listinitsize*sizeof(Elemtype));
if(!L->elem) return ERROR;
else{
L->length=0;
L->listsize=listinitsize;
return OK;
}
}
//输入数据
Status Inputlist(sqlist *L){
int i,e;
printf("t输入数据的个数:");
scanf("t%d",&i);
while(L->length<i){
printf("t输入第%d个数:",L->length+1);
scanf("t%d",&e);
L->elem[L->length]=e;
L->length++;
}
}
//判断顺序表是否为空
Status emptylist(sqlist L){
if(L.length==0)
return ERROR;
else
return OK;
}
//数据的输出
Status outlist(sqlist L){
int i;
if(emptylist(L)==1){
for (i=0;i<L.length;i++)
printf("t%d ",L.elem[i]);
printf("n");
}
else{
return ERROR;
}
}
//顺序表元素的个数
Status lengthlist(sqlist L){
return L.length;
}
//输出指定位置的元素
Status out_list(sqlist L,int i){
if(emptylist(L)!=1)
return ERROR;
if(i>L.length+1 || i<1)
return ERROR;
printf("t第%d个的元素是:%dn",i,L.elem[i-1]);
}
//输出指定元素的位置
Status index_list(sqlist L,int i){
int j;
if(emptylist(L)!=1)
return ERROR;
for (j=0;j<L.length;j++){
if(i==L.elem[j])
printf("t数据 %d 的位置是:%dn",i,j+1);
}
}
//插入指定位置和元素
Status insert_list(sqlist *L,int m,int n){
int i;
if(emptylist(*L)!=1)
return ERROR;
if(m>L->length+1 || m<0)
return ERROR;
if(L->length>=L->listsize){
newbase=(Elemtype *)malloc(L->elem,L->listsize+listincrement*sizeof(Elemtype));
if(!newbase)
return ERROR;
L->elem=newbase;
L->listsize=L->listsize+listincrement;
}
for(i=L->length-1;i>=m-1;i--)
L->elem[i+1]=L->elem[i];
L->elem[i+1]=n;
L->length++;
}
//删除指定位置的元素
Status delete_list(sqlist *L,int i){
int j;
if(emptylist(*L)!=1)
return ERROR;
if(i>L->length|| i<0)
return ERROR;
for(j=i-1;j<=L->length;j++){
L->elem[j]=L->elem[j+1];
}
L->length--;
}
//销毁顺序表
Status deletelist(sqlist *L){
free(L->elem);
L->elem=NULL;
return OK;
}
int main(){
sqlist l;
int index,k,data;
do{
printf("n");
printf("t************************************n");
printf("tt1.创建一个顺序表n");
printf("tt2.输入数据n");
printf("tt3.顺序表是否为空n");
printf("tt4.数据的输出n");
printf("tt5.顺序表元素的个数n");
printf("tt6.输出指定位置的元素n");
printf("tt7.输出指定元素的位置n");
printf("tt8.插入指定位置和元素n");
printf("tt9.删除指定位置的元素n");
printf("tt0.销毁顺序表n");
printf("t************************************n");
printf("t请输入序号:");
scanf("%d",&k);
switch(k){
case 0:{//销毁顺序表
if(deletelist(&l)==1)
printf("tyesn");
};break;
case 1:{//创建一个顺序表
if(Initlist(&l)==1)
printf("tokn");
else
printf("tonn");
};break;
case 2:{//输入数据
Inputlist(&l);
};break;
case 3:{//顺序表是否为空
if(emptylist(l)==0)
printf("t空n");
else
printf("t非空n");
};break;
case 4:{//数据的输出
if(outlist(l)==0)
printf("t空n");
};break;
case 5:{//顺序表元素的个数
printf("t元素个数:%dn",lengthlist(l));
};break;
case 6:{//输出指定位置的元素
printf("t输出第几个数据:");
scanf("t%d",&index);
if(out_list(l,index)==0)
printf("t空n");
};break;
case 7:{//输出指定元素的位置
printf("t输入数据:");
scanf("t%d",&data);
if(index_list(l,data)==0)
printf("t空n");
};break;
case 8:{//插入指定位置和元素
printf("t输入数据:");
scanf("t%d",&data);
printf("t输入位置:");
scanf("t%d",&index);
if(insert_list(&l,index,data)==0)
printf("t空n");
};break;
case 9:{//删除指定位置的元素
printf("t删除的位置:");
scanf("t%d",&index);
if(delete_list(&l,index)==0)
printf("t空n");
};break;
default :printf("t without n");
}
}while(1);
}
界面的样式
- 顺序表的基本操作
- 初始化线性表 InitList(&L)
- 该运算的结果是构造一个空的线性表 L,为线性表分配存储空间用于存放数 据元素。
- 销毁线性表 DestroyList(&L )
- 该运算的结果是释放线性表 L 占用的内存空间。
- 判定是否为空表 ListEmpty(L)
- 该运算返回一个值表示 L 是否为空表。若 L 为空表,则返回 1,否则返回 0。
- 求线性表的长度 ListLength(L)
- 该运算返回顺序表 L 的长度。实际上只需返回 length 成员的值即可。
- PriorElem( L, cur_e, &pre_e )
- 该运算返回给定数据元素的前驱数据元素的值。
- NextElem( L, cur_e, &next_e )
- 该运算返回给定数据元素的后继数据元素的值。
- 输出线性表 DispList(L)
- 该运算当线性表 L 不为空时,顺序输出 L 中各数据元素的值。
- 求某个数据元素值 GetElem(L,i,&e)
- 该运算返回 L 中第 i(1≤i≤ListLength(L))个元素的值,存放在 e 中。
- 按元素值查找 LocateElem(L,e)
- 该运算顺序查找第 1 个值域与 e 相等的数据元素的序号。若这样的元素不存在, 则返回值为 0。
- 插入数据元素 ListInsert(&L,i,e)
- 该运算在顺序表 L 的第 i 个位置(1≤i≤ListLength(L)+1)上插入新的元素 e。
- 删除数据元素 ListDelete(&L,i,&e)
- 该运算删除顺序表 L 的第 i(1≤i≤ListLength(L))个元素。
- 清空线性表 ClearList( &L )
- 删除线性表 L 中的所有数据元素,但不释放已分配给线性表的存储空间。