线性表的顺序存储结构
线性表的顺序存储结构
1.线性表:线性表是n个类型相同数据元素的有限序列。其逻辑结构是对于n>0,除第一个元素无直接前驱、最后一个元素无直接后继外,其余元素均只有一个直接前驱和一个直接后继,如下图所示,数据元素具有一对一的关系
记作(a1,a2,a3,···,ai-1,ai,ai+1,···,an)。
2.线性表的特点:
同一性:线性表由同类数据元素构成,每一个ai必须属于同一类数据类型。
有穷性:线性表由有限个数据元素组成,表的长度就是数据元素的个数。
有序性:线性表相邻元素之间存在序偶关系<ai,ai+1>。
3.线性表的顺序存储结构:指的是用一组连续的存储单元一次存储线性表中的各个元素,使得线性表中在逻辑上相连的元素存储在连续的物理存储单元上。通过数据元素物理存储的连续性来反映数据元素在逻辑上的相邻关系。采用顺序存储结构的线性表通常叫做顺序表。如下图,是顺序存储结构示意图:
图中k表示每一个数据在内存中占k个单元。Loc(a1)为该线性表第一个元素的地址。
4.顺序表的相关操作:(在VS2013编译环境下运行)
SeqList.h:
1 #pragma once 2 #include<stdio.h> 3 #include<assert.h> 4 #define MAXSIZE 100 5 typedef int SDataType; 6 typedef struct SeqList 7 { 8 SDataType array[MAXSIZE]; 9 int count;//保存线性表中的元素个数 10 }SeqList,*pSeqList; 11 12 void InitSeqList(pSeqList pS);//初始化线性表 13 void PushSeqList(pSeqList pS, SDataType data);//插入元素 14 int LengthSeqList(pSeqList pS);//返回线性表中元素的个数 15 int GetKSeqList(pSeqList pS, int k);//返回线性表中的第k个元素的值 16 void InsertSeqList(pSeqList pS, int k,SDataType data);//在第K的位置前插入指定元素data 17 void DelSeqList(pSeqList pS, int k);//删除在第K个位置的元素 18 void PrintSeqList(pSeqList ps);//打印线性表
SeqList.c:
1 #include"Seqlist.h" 2 void InitSeqList(pSeqList pS) 3 { 4 int i = 0; 5 for (i = 0; i < MAXSIZE; i++) 6 { 7 pS->array[i] = 0; 8 } 9 pS->count = 0; 10 } 11 void PushSeqList(pSeqList pS, SDataType data) 12 { 13 if (pS->count >= MAXSIZE) 14 { 15 printf("线性表已满,插入操作失败\n"); 16 return; 17 } 18 pS->array[pS->count] = data; 19 pS->count++; 20 } 21 void PrintSeqList(pSeqList pS) 22 { 23 int i = 0; 24 for (i = 0; i < pS->count; i++) 25 { 26 printf("%d ", pS->array[i]); 27 } 28 } 29 int LengthSeqList(pSeqList pS) 30 { 31 return pS->count; 32 } 33 int GetKSeqList(pSeqList pS, int k) 34 { 35 return pS->array[k-1]; 36 } 37 void InsertSeqList(pSeqList pS, int k, SDataType data) 38 { 39 if (pS->count < k) 40 { 41 printf("插入位置非法\n"); 42 return; 43 } 44 int i = pS->count; 45 if (i < MAXSIZE) 46 { 47 for (i; i>k; i--) 48 { 49 pS->array[i] = pS->array[i - 1]; 50 } 51 pS->array[i] = data; 52 pS->count++; 53 } 54 } 55 void DelSeqList(pSeqList pS, int k) 56 { 57 int i = k; 58 if (k >= pS->count) 59 { 60 printf("删除位置非法\n"); 61 return 0; 62 } 63 for (i;(i+1) < pS->count; i++) 64 { 65 pS->array[i] = pS->array[i+1]; 66 } 67 pS->count--; 68 }
test.c:(测试函数)
1 #include"Seqlist.h" 2 3 void test() 4 { 5 int k = 0; 6 int k1 = 0; 7 SeqList S; 8 InitSeqList(&S);//初始化线性表 9 PushSeqList(&S, 0); 10 PushSeqList(&S, 1);//插入元素 11 PushSeqList(&S, 2); 12 PushSeqList(&S, 3); 13 PushSeqList(&S, 4); 14 PushSeqList(&S, 5); 15 PrintSeqList(&S);//打印线性表 16 printf("\n"); 17 k = LengthSeqList(&S);//返回线性表中元素的个数 18 printf("线性表中元素的个数为:%d\n", k); 19 k1 = GetKSeqList(&S, 2); 20 printf("线性表中第%d个位置的元素为:%d \n", 2,k1); 21 InsertSeqList(&S, 2, 8); 22 PrintSeqList(&S); 23 printf("\n"); 24 DelSeqList(&S, 2); 25 PrintSeqList(&S); 26 } 27 28 int main() 29 { 30 test(); 31 system("pause"); 32 return; 33 }
运行界面如下图:
5.对于顺序表的插入删除操作,为保证逻辑上相邻的元素在物理地址上也相邻,在插入或删除一个元素后不得不进行大量的数据移动。因此,在顺序表中插入和删除一个数据元素时,其时间主要花费在移动数据元素上。做一次插入或删除平均需要移动顺序表中一半的元素,当n较大时算法效率低。但对于查找元素来说,顺序表很方便。