码迷,mamicode.com
首页 > 其他好文 > 详细

【数据结构】线性表的顺序表示及实现

时间:2016-05-13 14:24:48      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

    线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。

    假设线性表的每个元素需要占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储地址。则线性表中第i+1个元素元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足关系:

LOC(ai+1)=LOC(ai)+l

    一般来说,线性表第i个数据元素ai的存储位置为:

LOC(ai)=LOC(a1)+(i-1)*l

式中LOC(a1)是线性表的第一个数据元素a1的存储位置,通常称做线性表的起始位置或基地址。

    线性表的这种机内表示称做线性表的顺序存储结构或顺序映像,通常,称这种存储结构的线性表为顺序表。线性表的顺序存储结构是一种随机存取的存储结构

    由于高级程序设计语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的顺序存储结构。在此,由于线性表的长度可变,且所需最大存储空间随问题的不同而不同,则在C语言中可用动态分配的一维数组,如下描述:

1 // ----线性表的动态分配顺序存储结构----
2 #define LIST_INIT_SIZE 100   // 线性表存储空间的初始分配量
3 #define LISTINCREMENT 10     // 线性表存储空间的分配增量
4 typedef struct 
5 {
6     ElemType *elem;          // 存储空间基址
7     int length;              // 当前长度 
8     int listsize;            // 当前分配的存储容量 
9 } SqList;  

1. 创建一个新的顺序表

    参考代码如下:

技术分享
1 // 构造一个空的线性表L 
2 Status InitSqList(SqList &L)
3 {
4     L.elem = (ElemType *) malloc (LIST_INIT_SIZE*sizeof(ElemType)); 
5     if (!L.elem) exit(OVERFLOW); // 存储分配失败 
6     L.length = 0;                // 空表长度为0 
7     L.listsize = LIST_INIT_SIZE; // 初始存储容量 
8     return OK; 
9 }
View Code

2. 顺序表的插入操作

    时间复杂度O(n)

    参考代码如下:

技术分享
 1 // 在顺序表线性表L中第i个位置之前插入新的元素e, 
 2 // i的合法值为[1..L.length+1] 
 3 Status InsertSqList(SqList &L, int i, ElemType e)
 4 {
 5     if (i < 1 || i > L.length+1) return ERROR; // i值不合法 
 6     if (L.length >= L.listsize) // 当前存储空间已满,增加分配 
 7     {
 8         ElemType *newbase = (ElemType *) realloc(L.elem, 
 9                             (L.listsize + LISTINCREMENT) * sizeof(ElemType)); 
10         if (!newbase) exit(OVERFLOW); // 存储分配失败 
11         L.elem = newbase;             // 新基址 
12         L.listsize += LISTINCREMENT;  // 增加存储容量 
13     }
14     ElemType *q = &(L.elem[i-1]);     // q为插入位置 
15     for (ElemType *p = &(L.elem[L.length-1]); p >= q; p--)
16     {
17         *(p+1) = *p; // 插入位置及之后的元素右移 
18     } 
19     *q = e;          // 插入e 
20     ++L.length;      // 表长加1  
21     return OK; 
22 }
View Code

3. 顺序表的删除操作

    时间复杂度O(n)

    参考代码如下:

技术分享
 1 // 在顺序表中删除第i个元素,并用e返回其值
 2 // i的合法取值为[1..L.length] 
 3 Status DeleteSqList(SqList &L, int i, ElemType &e)
 4 {
 5     if (i < 1 || i > L.length) return ERROR; // i值不合法 
 6     ElemType *p = &L.elem[i-1];              // p为被删除元素的位置 
 7     e = *p;                                   // 被删除元素的值赋给e 
 8     ElemType *q = L.elem + L.length - 1;      // 表尾元素的位置 
 9     for (++p; p <= q; ++p) 
10         *(p-1) = *p;                          // 被删除元素之后的元素左移 
11     --L.length;                              // 表长减1 
12     return OK; 
13 }
View Code

 

完整测试代码参考:

技术分享
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 using namespace std; 
  5 
  6 typedef int ElemType; 
  7 typedef int Status; 
  8 
  9 #define OK 1
 10 #define ERROR 0
 11 #define OVERFLOW -2
 12 #define TRUE 1
 13 #define FALSE 0
 14 #define INFEASIBLE -1 
 15 
 16 // ----线性表的动态分配顺序存储结构----
 17 #define LIST_INIT_SIZE 100   // 线性表存储空间的初始分配量
 18 #define LISTINCREMENT 10     // 线性表存储空间的分配增量
 19 typedef struct 
 20 {
 21     ElemType *elem;          // 存储空间基址
 22     int length;              // 当前长度 
 23     int listsize;            // 当前分配的存储容量 
 24 } SqList;  
 25 
 26 // 构造一个空的线性表L 
 27 Status InitSqList(SqList &L)
 28 {
 29     L.elem = (ElemType *) malloc (LIST_INIT_SIZE*sizeof(ElemType)); 
 30     if (!L.elem) exit(OVERFLOW); // 存储分配失败 
 31     L.length = 0;                // 空表长度为0 
 32     L.listsize = LIST_INIT_SIZE; // 初始存储容量 
 33     return OK; 
 34 }
 35 
 36 // 在顺序表线性表L中第i个位置之前插入新的元素e, 
 37 // i的合法值为[1..L.length+1] 
 38 Status InsertSqList(SqList &L, int i, ElemType e)
 39 {
 40     if (i < 1 || i > L.length+1) return ERROR; // i值不合法 
 41     if (L.length >= L.listsize) // 当前存储空间已满,增加分配 
 42     {
 43         ElemType *newbase = (ElemType *) realloc(L.elem, 
 44                             (L.listsize + LISTINCREMENT) * sizeof(ElemType)); 
 45         if (!newbase) exit(OVERFLOW); // 存储分配失败 
 46         L.elem = newbase;             // 新基址 
 47         L.listsize += LISTINCREMENT;  // 增加存储容量 
 48     }
 49     ElemType *q = &(L.elem[i-1]);     // q为插入位置 
 50     for (ElemType *p = &(L.elem[L.length-1]); p >= q; p--)
 51     {
 52         *(p+1) = *p; // 插入位置及之后的元素右移 
 53     } 
 54     *q = e;          // 插入e 
 55     ++L.length;      // 表长加1  
 56     return OK; 
 57 }
 58 
 59 // 在顺序表中删除第i个元素,并用e返回其值
 60 // i的合法取值为[1..L.length] 
 61 Status DeleteSqList(SqList &L, int i, ElemType &e)
 62 {
 63     if (i < 1 || i > L.length) return ERROR; // i值不合法 
 64     ElemType *p = &L.elem[i-1];              // p为被删除元素的位置 
 65     e = *p;                                   // 被删除元素的值赋给e 
 66     ElemType *q = L.elem + L.length - 1;      // 表尾元素的位置 
 67     for (++p; p <= q; ++p) 
 68         *(p-1) = *p;                          // 被删除元素之后的元素左移 
 69     --L.length;                              // 表长减1 
 70     return OK; 
 71 }
 72 
 73 void TraverseSqList(SqList L)
 74 {
 75     for (int i = 0; i < L.length; i++)
 76     {
 77         cout << L.elem[i] << "\t"; 
 78         if ((i+1)%8 == 0) cout << endl;
 79     }
 80     cout << endl;
 81 } 
 82 
 83 int main(int argc, char *argv[])
 84 {
 85     SqList L; 
 86     InitSqList(L); 
 87     
 88     for (int i = 0; i < 120; i++)
 89     {
 90         InsertSqList(L, i+1, i); 
 91     }
 92     TraverseSqList(L); 
 93     
 94     for (int i = 0; i < 100; i++)
 95     {
 96         ElemType e; 
 97         DeleteSqList(L, 3, e); 
 98     } 
 99     
100     TraverseSqList(L); 
101     
102     return 0; 
103 }
View Code

 

【数据结构】线性表的顺序表示及实现

标签:

原文地址:http://www.cnblogs.com/xiaoxxmu/p/5487898.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!