您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】顺序存储结构线性表C语言版

2014-10-03 12:39 239 查看
【定义】线性表的顺序存储结构是指用一段地址连续的存储单元(就是数组)依次存储线性表的数据元素

【线性表的顺序存储结构代码】

#define MAXSIZE 50
typedef int ElemType;
typedef int Status;
struct list
{
int Elem[MAXSIZE];
int length;//这个长度是用过的数组的长度,也就是线性表的长度,区分数组的长度MAXSIZE
};
typedef struct list List;
一个这样的线性表的就是一个包含了数组和int类型的线性表长度的结构体,其中length值是一个从1到MAXSIZE的值,这个值会随着线性表的插入和删除而变化

【线性表的操作的函数代码】

/**
*返回值为是否成功
**/
Status GetElem(List *L,int i, ElemType *e)
{

if(L->length <0||i < 0 || i > L->length)
{
return ERROR;//判断线性表是否存在,要查找的元素是否数组越界
}
*e = L->Elem[i-1];
return OK;
}
/**在第i个位置之前上插入相应值,同时链表长度增加,这个插入不是将值替换*/
Status Listinsert(List *L,int i,ElemType e)//链表,位置,
{
int k = L->length;//临时变量用来存放数组下标
if(L->length == MAXSIZE) //判断表是否是满的
{
return ERROR;
}
if(i<0||i>L->length+1) //判断插入位置是否合理
{
return ERROR;
}
if(i>0||i<=L->length)//插入的地方不是表尾
{
for(k=L->length-1 ; k >=i-1; k--)
{
L->Elem[k+1] = L->Elem[k];
}
}
L->Elem[i-1]= e;//恰好是表尾的话就直接插入到这位置
L->length++;
return OK;

}
Status ListDelete(List *L,int i)
{
int k;
if(L->length == 0||i<0 ||i>L->length)//空表,删除位置是否合适的判断
return ERROR;

for(k=i-1; k<L->length-1; k++)
{
L->Elem[k] = L->Elem[k+1];
}
L->length--;
return OK;
}

void getLlength(List *L)
{
printf("当前链表长度为%d\n",L->length);
}
【测试用的主函数的代码】

int main()
{
List L = {{0},0};
int choose ;
int i;
int e;
int j;
while(1)
{

printf("***************************************************\n");
printf("输入操作\n");
printf("1.插入元素\n");
printf("2.删除元素\n");
printf("3.获取当前表长\n");
printf("4.显示所有的元素值\n");
printf("5.显示某位置的元素值\n");
printf("***************************************************\n");

scanf("%d",&choose);
switch(choose)
{

case 1:
printf("输入元素值和位置\n");
scanf("%d %d",&e,&i);

if(Listinsert(&L,i,e) == 0)
{
printf("error\n");
exit(0);
}
getLlength(&L);
break;
case 2:
printf("输入位置\n");
scanf("%d",&i);

if(ListDelete(&L,i) == 0)
{
printf("error\n");
exit(0);
}
getLlength(&L);

break;
case 3:
getLlength(&L);
break;
case 4:
for(j = 0; j< L.length; j++)
{
printf("%d   ",L.Elem[j]);
}
printf("\n  ");
break;
case 5:
printf("输入元素位置\n");
scanf("%d",&i);
if(GetElem(&L,i,&e) == 0)
{
printf("error\n");
exit(0);
}
printf("当前的元素的为%d\n",e);
break;
}
}
return 0;
}
【线性表的顺序存储结构的优缺点】

优点: 无须为表示表中的元素之间的逻辑关系而增加额外的存储空间,可以快速的存取表中的任意位置的元素

缺点:插入和删除操作需要移动大量的元素,线性表的长度变化较大的时候难以确定存储空间的容量,造成存储空间的“碎片”

【工程源码下载链接】

http://download.csdn.net/detail/u013583717/7999421


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: