您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页线性表之顺序存储结构

线性表之顺序存储结构

来源:意榕旅游网
线性表之顺序存储结构

数据结构和算法是程序设计的灵魂。坦诚的说,我在这方面是弱的可以。虽然工作这么多年了,因为种种借口,这块知识一直是我的痛处。

曾经在面试时大言不惭的说,这些知识在工作中很少用到,所以当年学习的东西早就还给学校了。其实不然,失去了灵魂的程序员如我,总是要逆袭的。 所以以后的学习中会有一些如孩童笔记般的文章出现在我的blog中,请大师们不要嘲笑,要提携。 定义

线性表可以说是最简单的数据结构,它的描述为:n个数据元素的有限序列。 记为:L=(a1,a2,...,an)

按照存储结构它又可以分为顺序存储结构和链式存储结构。

而其中线性表的顺序存储结构是最简单最常用的数据结构:用一段连续地址依次存储表中的数据元素。

看到这里,我们会自然的联想到C语言中的数组。

下面我要实现的是线性表中的元素为整型的顺序存储结构,及它的主要运算:增删查。

先来简单的定义一下这个线性表的顺序存储结构:

#define MAXLENGTH 20

struct sequencelist { int data[MAXLENGTH]; int length; };

其中data数组为这个线性表的主要部分,数据元素就存在于此数组中,而对这个线性表的操作都是基于这个数组。

length是这个线性表的一个属性,表示这个线性表包含元素的个数。 增:线性表的插入操作

对线性表的插入就是对data数组的插入,然后将其length增加。

//insert opration

int insert(struct sequencelist *list,int index,int element) { int length = list->length; if(length ==0 || index < 0 || index > length || length >= MAXLENGTH) return ERROR; list->data[index] = element; for(int i = length - 1;i>index;i--) { list->data[i+1] = list->data[i]; } list->length++; return OK; }

删:线性表的删除操作 类似增的相反操作。

// Delete opration

int delete(struct sequencelist *list,int index) { int length = list->length; if(length ==0 || index < 0 || index > length-1 ) return ERROR; for(int i = index;idata[i] = list->data[i+1]; } list->data[length-1] = '\\0';//delete the last element. list->length--; return OK; }

查:线性表的取元素操作 用索引值查找元素的值。

//get list elements

//make sure elemet is NOT NULL when calling.

int getElement(struct sequencelist list,int index,int *element) { printf(\"\\ngetElement\\n\"); int length = list.length; printf(\"length is %d\\n\

if(length ==0 || index < 0 || index >= length) return ERROR; *element = list.data[index]; return OK; }

从程序中可以看出增删操作的时间复杂度都是0(n),所以这两项操作都是不是它的强项。而查找操作的时间复杂度是O(1),那么线性表的顺序存储结构的优势就是可以快速的取出任意位置的元素。

上面的3种操作作为较为基本的操作,是本人的学习笔记。如果大虾们发现哪里有不妥,请不吝赐教。

而线性表的其他操作如求前驱元素、求后驱元素、判断表中是否存在某元素值、清空操作等等有意思的操作还待空闲时去完成。

较为完整的调试例子:

//2013.2 //lincoln //linear list

//Sequence Storage Structure //

#include

#define OK 1 #define ERROR -1 #define TURE 1 #define FALSE 0

#define MAXLENGTH 20

struct sequencelist { int data[MAXLENGTH]; int length; };

//get list elements

//make sure elemet is NOT NULL when calling.

int getElement(struct sequencelist list,int index,int *element) { printf(\"\\ngetElement\\n\"); int length = list.length; printf(\"length is %d\\n\

if(length ==0 || index < 0 || index >= length) return ERROR; *element = list.data[index]; return OK; }

//insert opration //

int insert(struct sequencelist *list,int index,int element) { printf(\"\\ninsert\\n\"); int length = list->length; printf(\"length is %d\\n\ if(length ==0 || index < 0 || index > length || length >= MAXLENGTH) return ERROR; list->data[index] = element; for(int i = length - 1;i>index;i--) { list->data[i+1] = list->data[i]; } list->length++; return OK; }

// Delete opration //

int delete(struct sequencelist *list,int index) { printf(\"\\ndelete\\n\"); int length = list->length; printf(\"length is %d\\n\ if(length ==0 || index < 0 || index > length-1 ) return ERROR; for(int i = index;idata[i] = list->data[i+1]; } list->data[length-1] = '\\0';//delete the last element. list->length--; return OK; }

int main()

{

struct sequencelist list = { {3,1,5,7,12,78,34}, 7 };

printf(\"list length : %d\\n\//Test get

int *element = 0, test = 8; element = &test;

if(OK == getElement(list,2,element)) { printf(\"list get 2 :%d\\n\}

//Test insert

if(OK == insert(&list,7,520)) { printf(\"list insert 7 ok!\\n\"); }

if(OK == getElement(list,7,element)) { printf(\"list get 7 :%d\\n\}

if(OK == insert(&list,3,520)) { printf(\"list insert 3 ok!\\n\"); }

if(OK == getElement(list,3,element)) { printf(\"list get 3 :%d\\n\}

//Test delete

if(OK == delete(&list,3)) { printf(\"list delete 3 ok!\\n\"); }

if(OK == getElement(list,3,element)) { printf(\"list get 3 :%d\\n\}

if(OK == delete(&list,6)) {

}

printf(\"list delete 6 ok!\\n\"); }

if(OK == getElement(list,6,element)) { printf(\"list get 6 :%d\\n\} else { printf(\"list get ERROR!\\n\"); }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务