数据结构 在丢了一年多再度捡起,觉得数据结构还是很重要。所以重新再来翻翻,希望可以收获一些不一样的东西,就当作是总结。也希望借此可以向大家多多学习。如有错误,希望指证!
首先从线性表讲起,顾名思义。线性表具有线性的特征(可以用离散里的反对称解释),就是说各元素之间是有先后顺序的。在线性表中,除了第一个元素,每个元素都有唯一前驱。除了最后一个元素外,每个元素都有唯一后继。而且只有一个被称为“第一个”的数据元素,和存在唯一被称作“最后一个”的数据元素。其实线性表有两种存储结构,一种是顺序存储,一种是链式存储。顺序存储跟数组类似,可以随机存取第i个数据元素。
首先介绍线性表顺序存储的基本操作:
#define INIT_SIZE_LINKLIST 100
#define sizeincreament 10
#define ok 1
#define error 0
#define overflow -1
typedef struct{
int *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
status InitList(Sqlist &L)
{//线性表的初始化
L.elem = (int *) malloc(INIT_SIZE_LINKLIST*sizeof(int));
if(!L.elem) return (overflow); //存储分配失败
L.length = 0; //空表长度为0
L.listsize = INIT_SIZE_LINKLIST;//初始存储容量
return OK;
}
status listinsert(sqlist &L,int i,int &e)
{//线性表的插入操作,在第i个位置前插入元素e.
if(i<1||i>L.lenghth+1) return error;//i 的合法值1<=i<=length+1
if(L.length>=L.listsize) {//说明线性表已满需要增加空间
int *newbase;//新的基地址
newbase = (int *)realloc(newbase,(listsize+listincreament)*sizeof(int));
if(!newbase) return (overflow);//存储分配失败
L.elem = newbase;//把新的基地址赋给之前的基地址
listsize += listincreament;//大小以及改变,加上新的空间
}
int *q = &(L.elem[i-1]);//把第i个元素的地址赋给一个指针变量q
int *p;
for(p = &(L.elem[L.length-1]);p>=q;--p) *(p+1) = *p;
*q = e;
++L.length;
return ok;
}
status ListDelet(sqlist &L,int i,int &e)
{//删除第i个元素,用e返回。
if(i<1||i>L.length+1) return error;
int *p = &(L.elem[i-1]);
e = *p;//被删除元素赋给e
int *q = L.elem+L.length-1;
for(++p;p<=q;++p) *(p-1) = *p;//被删除元素之后的元素左移
--L.length;
return ok;
}
更新。。中。。
本文介绍了数据结构中线性表的概念及其顺序存储结构。详细讲述了线性表的初始化、插入及删除等基本操作,并提供了具体的实现代码。
3797

被折叠的 条评论
为什么被折叠?



