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

数据结构之线性表—>顺序存储结构

2017-02-28 19:37 447 查看
数学语言定义:
若将线性表记为(a1,...,ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1时ai的直接前驱元素,ai+1是ai的直接后继元素。当i=1,2,3,...,n-1时,ai有且仅有一个直接后继,当i=2,3,4,...,n时,ai有且仅有一个直接前驱。所以线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。

    在复杂的线性表中,一个数据元素可以由若干个数据项组成。
本人比较懒,没有对所对实现的代码全部调通,但是基本的理解写在下面希望还能与大家分享:
线性表的抽象数据类型定义如下:
ADT 线性表 (List)
Data
线性表的数据对象集合为{a1,a2,......,an},每个元素的类型均为DataType。其中,除第一个元素a1外,每个元素有且仅有一个直接前驱元素,初了最后一个元素an外,每个元素有且仅有一个直接后继元素。数据元素之间的关系时一对一的关系。
Operation
InitList(*L):初始化操作,建立一个空的线性表L。
ListEmpty(L) :若线性表为空,返回true,否则反悔false。
Clear list(*L):将线性表清空。
GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e。
LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回改元素在表中序号表示成功;否则,返回0表示失败。
ListInsert(*L,i,e):在线性表L中的第i个位置插入新元素e。
List Delete(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值。
ListLength(L):返回线性指针L的元素个数。
endADT

       这个位置原来在我一开始学的时候总是个问题,不知道为什么在实现不同功能的时候会用到指针和数据结构类型的变量,这导致我做实验的时候遇到很大困难,现在回头看看其实就是自己的指针没有活学活用,对C的掌握还是不够熟练,这次通过看了同学的代码,发现的规律,从这个规律进行下去,查找资料成功解决了这个问题。
我想,在博客里搜索这个问题的朋友们一样会遇到跟我一样的问题,所以我所行在这里献个丑,与大家交流,相互学习!
我发现在进行需要改变线性表得时候都会用到指向这个线性表的指针,同样的需要修改线性表的值的时候,比如删除并取出其值的时候都会用到指针,这是因为,在实现我们要实现的函数的时候,在函数内部都是局部变量,当这个函数执行结束后,局部变量就会自动清除,不会对线性表中的值真正的进行修改,所以只有通过指针,修改其真正的地址内的值,才会在函数执行结束后保留结果,达到我们想要的目的。同理在取值的时候也一样,如果用int e的话,这个局部变量在函数执行结束后回复原值,不会有改变,所以要实用指针。
Sqlist lst//定义顺序名称。

Sqlist *lst //定义顺序表结构指针,用来保存顺序表结构。

以上例子输出20,初始化时a被赋值了10,然后定义了指针p并初始化为a的地址,使p指向a,然后通过星号对p所指内存赋值为20,这叫间接寻址,因为p的值是a的地址,因此*p意思为a的值,a被改为20.你的例子中,是将取得的值赋值到e所指变量中,而如果采用e赋值,改变的是e的值,e是局部指针变量,函数结束就释放了,e所指的变量就取不到值,不会发生任何变化。
相信看完了这些,跟我一样的小白们是不是又了一点点的理解了,线性表是数据结构算法的开篇,也是基础,虽说不难,但时候很重要,希望刚学到这里的,刚用到这里的朋友们引起足够的重视!
下面介绍几个简单的函数代码,来加深一下理解:
1.线性表顺序存储结构的代码:
#define MAXSIZE 20
typedef int ElemType

typedef struct
{

ElemType data[MAXSIZE];

int length;

 }SqList;

三个属性:

·存储空间其实位置:数组data,他的存储位置就是空间的存储位置。

·线性表的最大存储容量:数组长度MaxSize。

·线性表的当前长度:length。
2.顺序存储的插入与删除操作:
2.1获得元素操作:
#define OK 1;

#define ERROR 0;

#define TURE 1;

#define FALSE 0;

typedef int status;

status GetElem(SqList L,int i,ElemType* e)

{

if(L.length==0||i<1||i>L.length)

return ERROR;

*e=L.data(i-1);

return OK;

}

2.2插入操作:

思路:

·如果插入位置不合理,抛出异常;

·如果线性表长度大于等于数组长度,抛出异常或者动态增加容量;

·从最后一个元素开始向前遍历到第i个位置,分别将他们都向后移动一个位置;

·将要插入元素填入位置i处;

·表长加1。

这里我们实现ListInsert(*L,i,e),代码实现://初始化顺序线性表L已经存在,1<=i<=Listlength(L);

//操作结果:在L中第i个位置之前插入新的数据元素e,L长度加1;

status ListInsert(SqList *L,int i,ElemType e)

{

int k;

if(L->length==MAXSIZE)

return ERROR;

if(i<1 || i>L->length+1)

return ERROR;

if(i<=L->length)

{

for(k=L->length-1;k>=i-1;k--)

L->data[k+1]=L->data[k];

}

L->data[i-1]=e;

L->length++;

return OK;

}

2.3 删除操作:

算法的思路:

1)如果删除位置不合理,抛出异常;

2)取出删除元素;

3)从删除元素位置开始便利到最后一个元素位置,分别将它们都向前移动一个位置;

4)表长减一;

代码实现如下:

/*操作条件:顺序线性表L已存在,1<=i<=ListLength(L)*/
/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)*/

status ListDelete(SqList *L,int i,ElemType *e)

{

int k;

if(L->length==0)

return ERROR;

if(i<1 || i>L->length)

return ERROR;

*e=L->data[i-1];

if(i<L->length)

{

for(k=i;k<L->length;k++)

L->data[k-1]=L->data[k];

}

L->length--;

return OK;

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