线性表的实现分顺序存储结构和链式存储结构。
顺序表属于线性表的一种,是用一组地址连续的存储单元依次来实现对元素的存储。
但是,顺序结构最大的缺点就是在进行插入和删除操作的时候,如果插入位置不理想,那么需要移动大量的元素。可以发现在顺序存储结构中,他们相邻的元素的存储位置也是相邻的,在申请内存的的时候,是一次性申请一块连续的内存,中间是没有空隙的,这样也就没办法进行快速的插入,如果进行删除操作,就需要进行位置的填充。
顺序结构最大的好处就是可以快速的存取表中的任一位置的元素。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LISTINCREMENT 10
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
#define LIST_INIT_SIZE 100 //顺序表可能达到的最大长度
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
//初始化
Status InitList(SqList &L)
{
L.elem = (ElemType *) malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(! L.elem)
exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
//插入
Status insertElement(SqList &L , int i , ElemType e){
if(1>i || i>L.length+1)
return ERROR;
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 *p = &(L.elem[i-1]);
ElemType *q = &(L.elem[L.length-1]);
for( ; q>=p ; q--){
*(q+1) = *q ;
}
*p = e;
L.length += 1;
return OK;
}
//在顺序表L中删除第i个元素,并用e返回其值
Status deleteElement(SqList &L , int i , ElemType &e){
if(1>i || L.length<i){
return ERROR;
}
ElemType *p = &L.elem[i-1];
e = *p;
ElemType *q = &L.elem[L.length-1];
for( ; p<=q ; p++){
*p = *(p+1);
}
L.length -= 1;
return OK;
}
//在顺序表中查找元素
int locateElement(SqList &L , ElemType e){
//ElemType *p = &(L.elem[0]);
int i ;
for(i = 0 ; i<L.length ; i++){
if(L.elem[i]==e){
return i;
}
}
return ERROR;
}
//在顺序表中修改第i个元素的值
Status update(SqList &L , int i , ElemType e){
if(1>i || L.length<i){
return ERROR;
}
L.elem[i-1] = e;
return OK;
}
int main()
{
SqList L;
int temp,a,b,c,e,choose;
printf("1. 建立顺序表\n");
printf("2. 输入数据\n");
printf("3. 查找\n");
printf("4. 插入\n");
printf("5. 删除\n");
printf("6. 输出数据\n");
printf("0. 退出\n\n");
choose=-1;
while(choose!=0)
{
printf("请选择:");
scanf("%d",&choose);
switch(choose)
{
case 1:
if(InitList(L)) //创建顺序表,并打印出成功或失败的信息
printf("成功建立顺序表");
else
printf("建立顺序表失败");
break;
case 2: //输入10个数放入到顺序表中
printf("请输入10个数字进去:");
int i;
for(i=0;i<10;i++)
scanf("%d",&L.elem[i]);
L.length=i;
break;
case 3: //顺序表的查找
printf("请输入所要查找的数:");
scanf("%d",&e);//输入e,代表所要查找的数值,如果成功显示要查找的数是第几个,如果是吧显示没有这样的数
temp = locateElement(L,e);
if(temp!=0)
printf("查找成功\n");
printf("对应的序号为:%d\n",temp-1);
break;
case 4: //顺序表的插入
printf("请输入两个数,分别代表插入的位置和插入数值:");
scanf("%d%d",&a,&b); //输入a和b,a代表插入的位置,b代表插入的数值
if(insertElement(L,a,b))
printf("插入成功");
break;
case 5: //顺序表的删除
printf("请输入所要删除的数:");
scanf("%d",&c); //输入c,代表要删除数的位置
if(deleteElement(L,c,e))
printf("删除成功");
break;
case 6: //顺序表的输出
for(i=0;i<L.length;i++)
printf("%d\n",L.elem[i]);
break;
}
}
return 0;
}