线性表的顺序存储结构

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. css 背景图片虚化效果

    转载地址:http://blog.csdn.net/ohehehou/article/details/5197 […]...

  2. 云上大陆玩法心得

    玩法心得 游戏教学,抖音搜: 钟哥(游戏主播) 冲榜,升级材料留到冲榜当天《例如伙伴榜,再用伙伴升级材料)《不 […]...

  3. SIFT,SURF,ORB,FAST,BRISK 特征提取算法比较

    原文:http://blog.csdn.net/vonzhoufz/article/details/46594 […]...

  4. 网络协议 10 – Socket 编程:实践是检验真理的唯一标准

        前面一直在说各种协议,偏理论方面的知识,这次咱们就来认识下基于 TCP 和 UDP 协议这些理论知识的 […]...

  5. Uni-app: 扫码(以微信小程序为例)

    说明 个人使用环境说明 设备环境:win10 64bit 编译环境:HBuilder X 运行环境 :微信开发 […]...

  6. 个人网站一步一步搭建——(5)文章详情页面前端

    我在连接博客园图片的时候发现了防盗链。就是说要我打开博客园网站 才能引用里面的图片。我得把图片下载下来。图片都 […]...

  7. CentOS7 【linux系统】配置 JDK 教程

    1. 下载 【linux版本】 JDK 1.8 的包。  2. 导入linux系统里面。 如何导入,下载一个w […]...

  8. Cache Line操作和Cache相关概念介绍

    1.计算机存储体系简介      存储器是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量 […]...

展开目录

目录导航