线性表的顺序存储结构

love-you1314 2018-09-22 原文

线性表的顺序存储结构

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较大时算法效率低。但对于查找元素来说,顺序表很方便。

发表于 2018-09-22 11:11 浅忆梦微凉 阅读() 评论() 编辑 收藏

 

版权声明:本文为love-you1314原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/love-you1314/p/9689699.html

线性表的顺序存储结构的更多相关文章

随机推荐

  1. jQuery on()方法示例及jquery on()方法的优点

    https://www.jb51.net/article/71614.htm#jQuery on()方法是官方推荐的绑定事件的一个方法。1$(selector).on(event,childSelector,data,function,ma...

  2. Vue富文本编辑器(图片拖拽缩放)

    富文本编辑器(图片拖拽缩放)支持自定义上传图片、支持图片的百分比设置、支持动态生成html字符串。 富文本编辑 […]...

  3. Ubuntu16.04 安装Teamviewer – 王老头

    Ubuntu16.04 安装Teamviewer   有时需要远程控制ubuntu系统的电脑,Teamview […]...

  4. 博客园 首页 新随笔 联系 订阅 管理 Python学习笔记(matplotlib篇)–条形图

    Python学习笔记–条形图   参靠视频:《Python数据可视化分析 matplotlib教程 […]...

  5. Bootstrap的常用案例总结

    (***)仅列出些自己见过的常用的~具体的样式、组件、插件及属性设置见官网: http://www.bootc […]...

  6. 错误日志之观察者模式

    星期一 情景 早晨,项目组长来到小明身边,“有人反映咱们的项目有Bug” “什么Bug?” “不知道,你添加一 […]...

  7. 提高github代码下载速度的小技巧

    1.打开如下路径: C:\Windows\System32\drivers\etc 2.将此处的HOSTS文件 […]...

  8. 基于Spring封装的Javamail实现邮件发送

    1.依赖 <dependency> <groupId>org.springframew […]...

展开目录

目录导航