浅谈数据结构之线性表顺序存储
Posted 连城无忧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈数据结构之线性表顺序存储相关的知识,希望对你有一定的参考价值。
首先,数据结构是由某一数据元素集合及该集合中所有数据元素之间的关系组成。具体来说,数据结构应当包含三方面的内容:(1).数据的逻辑结构;(2).数据的存储结构;(3).对数据所施加的操作。而数据的存储结构形式有两种:顺序存储与链式存储。在这里,先谈一谈线性表的顺序存储。
线性表:零个或多个数据元素的有限序列。第一,它是一个序列,也就是说,元素之间是有顺序的;第二,它是有限的,即元素个数是有限的。而线性表的顺序存储结构,说白了,就是在内存中找块地,通过占位的形式把一定的内存空间给占了,然后把相同数据类型的数据元素依次存放在这块空地中。我们发现,描述顺序存储结构需要三个属性:(1).存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置;(2).线性表的最大存储容量:数组长度MaxSize;(3).线性表的当前长度:length。注意:在任意时刻,线性表的长度应该小于等于数组的长度。因为线性表的长度是线性表中数据元素的个数,随着线性表插入与删除操作的进行,这个值是变化的。还有一点:线性表的第i个元素是要存储在数组下标为i-1的位置上,因为在C语言中,数组是从0开始第一个下标的。对于一个线性表来说,插入数据与删除数据都是必须的操作,此外,初始化、置空线性表,顺序输出线性表中数组的元素也是常见的操作。具体操作代码如下所示:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define OK 1 5 #define ERROR 0 6 #define TRUE 1 7 #define FALSE 0 8 9 #define MAXSIZE 100 /* 存储空间初始分配量 */ 10 11 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ 12 typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */ 13 14 Status visit(ElemType c) 15 { 16 printf("%d ",c); 17 return OK; 18 } 19 20 typedef struct 21 { 22 ElemType data[MAXSIZE]; /* 数组,存储数据元素 */ 23 int length; /* 线性表当前长度 */ 24 }SqList; 25 26 /* 初始化顺序线性表 */ 27 Status InitList(SqList *L) 28 { 29 L->length=0; 30 return OK; 31 } 32 33 /* 初始条件:顺序线性表L已存在;操作结果:将L重置为空表 */ 34 Status ClearList(SqList *L) 35 { 36 L->length=0; 37 return OK; 38 } 39 40 /* 初始条件:顺序线性表L已存在;操作结果:返回L中数据元素个数 */ 41 int ListLength(SqList L) 42 { 43 return L.length; 44 } 45 46 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ 47 /* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */ 48 Status GetElem(SqList L,int i,ElemType *e) 49 { 50 if(L.length==0 || i<1 || i>L.length) 51 return ERROR; 52 *e=L.data[i-1]; 53 54 return OK; 55 } 56 57 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ 58 /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ 59 Status ListInsert(SqList *L,int i,ElemType e) 60 { 61 int k; 62 if (L->length==MAXSIZE) /* 顺序线性表已经满 */ 63 return ERROR; 64 if (i<1 || i>L->length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */ 65 return ERROR; 66 67 if (i<=L->length) /* 若插入数据位置不在表尾 */ 68 { 69 for(k=L->length-1;k>=i-1;k--) /* 将要插入位置之后的数据元素向后移动一位 */ 70 L->data[k+1]=L->data[k]; 71 } 72 L->data[i-1]=e; /* 将新元素插入 */ 73 L->length++; 74 75 return OK; 76 } 77 78 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ 79 /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */ 80 Status ListDelete(SqList *L,int i,ElemType *e) 81 { 82 int k; 83 if (L->length==0) /* 线性表为空 */ 84 return ERROR; 85 if (i<1 || i>L->length) /* 删除位置不正确 */ 86 return ERROR; 87 *e=L->data[i-1]; 88 if (i<L->length) /* 如果删除不是最后位置 */ 89 { 90 for(k=i;k<L->length;k++) /* 将删除位置后继元素前移 */ 91 L->data[k-1]=L->data[k]; 92 } 93 L->length--; 94 return OK; 95 } 96 97 /* 初始条件:顺序线性表L已存在 */ 98 /* 操作结果:依次对L的每个数据元素输出 */ 99 Status ListTraverse(SqList L) 100 { 101 int i; 102 for(i=0;i<L.length;i++) 103 visit(L.data[i]); 104 printf("\n"); 105 return OK; 106 } 107 108 int main() 109 { 110 111 SqList L; 112 ElemType e; 113 Status i; 114 int j; 115 116 i=InitList(&L); 117 printf("1.初始化L后:L.length=%d\n",L.length); 118 119 for(j=1;j<=10;j++) 120 ListInsert(&L,j,j); 121 printf("2.在L的表尾依次插入1~10后:L.data="); 122 ListTraverse(L); 123 printf("L.length=%d \n",L.length); 124 125 ListInsert(&L,1,0); 126 printf("3.在L的表头插入0后:L.data="); 127 ListTraverse(L); 128 printf("L.length=%d \n",L.length); 129 130 GetElem(L,6,&e); 131 printf("4.第6个元素的值为:%d\n",e); 132 133 ListDelete(&L,5,&e); 134 printf("5.删除第%d个的元素值为:%d\n",5,e); 135 printf("依次输出L的元素:"); 136 ListTraverse(L); 137 138 ListInsert(&L,5,4); 139 printf("6.插入第5个元素值后,依次输出L的元素:"); 140 ListTraverse(L); 141 142 GetElem(L,8,&e); 143 printf("7.第8个元素的值为:%d\n",e); 144 145 i=ClearList(&L); 146 printf("8.清空L后:L.length=%d\n",L.length); 147 148 return 0; 149 }
以上是关于浅谈数据结构之线性表顺序存储的主要内容,如果未能解决你的问题,请参考以下文章
数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)