【转】基础知识系列1--线性表之顺序表
原文地址:http://www.cnblogs.com/mcgrady/p/3181073.html
这个系列包括了C和C#两个版本的代码,我这里只取其中的C语言代码学习,另外我根据我的需要可能会打乱学习的顺序,对于源代码可能稍作修改,需要学习的博友们可以去原地址查看。
这一篇主要总结线性表之顺序表的相关操作,主要分以下几个部分来总结。
1,什么是线性表?
2,线性表的两种存储结构?
3,顺序表的存储结构表示?
4,顺序表的常见操作和代码实现?
1.什么是线性表
线性表就是关系中的一对一的关系,如果是一对多就用树来表示,如果多对多就用网状来表示。
线性表具有以下四个特征:
1> 有且只有一个“首”元素
2> 有且只有一个“尾”元素
3> 除“首”元素外,其余元素都有唯一的后继元素。
4> 除“尾”元素外,其余元素都有唯一的前驱元素。
2.线性表的两种存储结构
1> 顺序表,即线性表用顺序存储结构保存数据,数据是连续的。这一篇文章总结的就是顺序表
2> 链表,即线性表用链式存储结构保存数据,数据不连续。
3.顺序表的存储结构表示
4.顺序表的常见操作和代码实现
顺序表主要有以下常见操作,我们一般用数组来保存数据
1,初始化
思路:将数组的长度length设为0,时间复杂度为O(1)。
2,求顺序表的长度
思路:获取数组的length值,时间复杂度为O(1)。
3,插入元素
思路:分两种情况,一种是插入位置在数组的末尾,这种情况与添加元素相同。另一种情况是插入位置在数组的开始,这时候被插入元素的后续元素都要依次向后移动一位,也就是说整个数组都会移动,所以时间复杂度为O(n)。
4,删除元素
思路:同样分两种情况,一种是删除位置在数组的末尾,不用移动任何元素,因此时间复杂度为O(1);另一种情况是删除位置在数组的开始,这时被删除元素的后续元素都要依次向前移动一位,因此时间复杂度为O(n)。
5,按序号查找元素
思路:因为顺序表的存储地址是连续的,所以第n个元素的地址公式为:(n-1)*单元存储长度,不用移动任何元素,因此时间复杂度为O(1)。
6,按关键字查找元素
思路:一般用for循环,因此时间复杂度为O(n)。
代码实现:
1 #include "stdio.h" 2 3 #define OK 0 4 #define ERROR -1 5 #define MAXSIZE 5 6 7 typedef int Status; 8 typedef int ElemType; 9 typedef struct //定义顺序表 10 { 11 ElemType data[MAXSIZE]; 12 int length; 13 }SeqList; 14 /*初始化*/ 15 Status InitSeqList(SeqList *seqList) 16 { 17 seqList->length = 0; 18 return OK; 19 } 20 /*求顺序表的长度*/ 21 int GetSeqListLen(SeqList *seqList) 22 { 23 return seqList->length; 24 } 25 /*插入数据(在第n个元素之前的位置插入新元素)*/ 26 Status Insert(SeqList *seqList,int n,ElemType e) 27 { 28 int k; 29 30 if(seqList->length>=MAXSIZE) //检查数组是否已满 31 return ERROR; 32 33 if((n<1)||(n>seqList->length+1)) //检查n是否超出范围 34 return ERROR; 35 36 if(n<=seqList->length) //若插入位置不在表尾 37 { 38 for(k=seqList->length-1;k>=n-1;k--) 39 { 40 seqList->data[k+1] = seqList->data[k]; //将要插入位置之后的元素依次向后移动一位 41 } 42 } 43 //将新元素插入到腾出的位置,表长加一 44 seqList->data[n-1] = e; 45 seqList->length++; 46 47 return OK; 48 } 49 /*删除元素*/ 50 Status Delete(SeqList *seqList,int n,ElemType *e) 51 { 52 int k; 53 54 if(seqList->length == 0) //判断数组是否为空 55 return ERROR; 56 if((n<1)||(n>seqList->length)) //判断n的位置是否合法 57 return ERROR; 58 59 *e = seqList->data[n-1]; //保存删除的数字 60 61 if(n<seqList->length) 62 { 63 for(k=n;k<seqList->length;k++) 64 { 65 seqList->data[k-1] = seqList->data[k]; //将删除位置后继元素依次前移 66 } 67 } 68 69 seqList->length--; 70 71 return OK; 72 } 73 /*查找元素*/ 74 int GetDataByIndex(SeqList *seqList,int n) 75 { 76 if((n<1)||(n>seqList->length)) //检查是否超出范围 77 return ERROR; 78 return seqList->data[n-1]; 79 } 80 /*打印顺序表*/ 81 void Display(SeqList *seqList) 82 { 83 int i; 84 for(i=0;i<seqList->length-1;i++) 85 printf("%d--",seqList->data[i]); 86 printf("%d\n",seqList->data[i]); 87 } 88 89 int main(void) 90 { 91 SeqList seqList; 92 int j,k; 93 Status i; 94 ElemType elem; 95 96 InitSeqList(&seqList); 97 98 for(j=1;j<=5;j++) 99 { 100 if(Insert(&seqList,j,j)) 101 { 102 printf("Insert error.\n"); 103 return 0; 104 } 105 } 106 Display(&seqList); 107 108 if(Delete(&seqList,3,&elem)) 109 { 110 printf("Delete error.\n"); 111 return 0; 112 } 113 Display(&seqList); 114 115 k=GetDataByIndex(&seqList,2); 116 if(k == -1) 117 printf("get data error.\n"); 118 else 119 printf("2th is %d\n",k); 120 121 printf("length is %d\n",GetSeqListLen(&seqList)); 122 return 0; 123 }