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

线性表的顺序表示和实现

2015-10-19 20:21 176 查看
线性表的顺序表示指的是用一组地址连续的存储单元存储线性表的数据元素。

假设线性表的每个元素需占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。则线性表中第i+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足下列关系:

LOC(ai+1)=LOC(ai)+l

一般来说,线性表的第i个数据元素ai的存储位置为
LOC(ai)=LOC(a1)+(i-1)×l

式中LOC(a1)是线性表的第一个数据元素a1的存储位置,通常叫做线性表的起始位置或基地址。
线性表的这种机内表示称作线性表的顺序存储结构或顺序映像,通常称这种存储结构的线性表为顺序表。

------------------线性表的动态分配顺序存储结构------------------

#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
//线性表存储空间的初始分配量
#define LISTINCREMENT 10
//线性表存储空间的分配增量
typedef struct{
int *elem;
int length;
int listsize;
}SqList;//构造一个空的线性表L
int InitList_Sq(SqList &L){
L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem)
exit(OVERFLOW);   //存储分配失败
L.length=0;           //空表长度为零
L.listsize=LIST_INIT_SIZE;        //初始存储容量
return OK;
}

//在顺序表L的第i个位置前插入新的元素e
int ListInsert_Sq(SqList &L,int i,int e){
//i的合法值为1≤i≤ListLength_Sq(L)+1
if(i<1||i>L.length+1)
return ERROR;
if(L.length>=L.listsize){
int *newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)
exit(OVERFLOW);          //存储分配失败
L.elem=newbase;              //新基址
L.listsize+=LISTINCREMENT;   //增加存储容量
}
int *p,*q;
q=&(L.elem[i-1]);    //q为插入位置
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;       //插入位置及之后的元素右移一位
*q=e;                //插入e
++L.length;          //表长加1
return OK;
}

//在线性顺序表L中删除第i个元素,并用e返回其值
int ListDelete_Sq(SqList &L,int i,int &e){
//i的合法值为1≤i≤ListLength_Sq(L)
if((i<1)||i>L.length)
return ERROR;
int *p,*q;
p=&(L.elem[i-1]);     //p为被删除元素的位置
e=*p;                 //被删除的元素的值赋给e
q=L.elem+L.length-1;  //表尾元素的位置
for(++p;p<=q;++p)
*(p-1)=*p;        //被删除的元素之后的元速左移一位
--L.length;           //表长减1
return OK;
}

//遍历顺序线性表L
int ListTraverse(SqList L){
int i;
for(i=0;i

------------------结果预览------------------

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