线性表的顺序存储:

线性表的顺序存储指的是将线性表的数据元素按其逻辑次序依次存入一组地址连续的单元里,用这种方法存储的线性表称为顺序表。
只要确定线性表存储的起始位置,线性表中任意一个元素都可以随机存取,所以线性表是一种随机存取结构。

特点:在逻辑关系上相邻的两个元素在物理位置上也是相邻的,因此可以随机存取表中任一元素。

对于线性表,常见的基本运算有以下几种:

  • 置空表,构造一个空的线性表
  • 求表长
  • 获取表中第i个元素的值,1<=i<=length
  • 按值查找位置
  • 插入
  • 删除

由于数组类型具有随机存取的特性,所以通常用数组来描述顺序表。

定义顺序表类型

创建SeqList.c文件,定义一个SeqList表结构。

#include <stdio.h>
#include <stdlib.h>#define MAX_LENGTH 15        //表的最大长度
typedef int DataType;
typedef struct{int data[MAX_LENGTH];   //数组data用来存放表结点int length;
}SeqList;

实现各个方法。

/*打印List
*/
void PrintfList(int a[], int length){printf("打印数组\n");for(int i = 0; i < length; i++){printf("%d ",a[i]);}printf("\n");
}/*构造一个表
*/
void InitList(SeqList *L,int a[], int length){if (length > MAX_LENGTH) {printf("错误: 数组最大%d",MAX_LENGTH);return;}for(int i = 0; i < length; i++){L->data[i] = a[i];}L->length = length;PrintfList(L->data,length);printf("初始化完成\n");
}/*插入算法在顺序表L中第i个位置前插入一个新元素x
*/
void InsertList(SeqList *L,int i,int x){printf("在第%d个位置插入%d\n",i,x);int j;if (i < 1 || i > L->length+1) {printf("position error\n");return;}if (L->length>=MAX_LENGTH) {printf("overflow\n");return;}for( j = L->length-1; j >= i-1; j--){L->data[j+1] = L->data[j];  //从最后一个元素开始逐一后移}L->data[i-1] = x;       //插入新元素xL->length++;            //实际长度加1PrintfList(L->data,L->length);
}/*删除算法在顺序表L中删除第i个元素,并返回删除的元素
*/
int DeleteList(SeqList *L,int i){printf("删除第%d向\n",i);int j;int x; //DataType是一个通用类型标识符,在使用的时候定义实际类型if (i<1 || i>L->length) {printf("position error");exit(0);                    //出错退出处理。exit(1)正常退出,exit(0)非正常退出}x = L->data[i];                 //保存被删除的元素for( j = i; j <= L->length; j++){L->data[j-1] = L->data[j];  //元素前移}L->length --;PrintfList(L->data,L->length);return x;
}/*按值查找
*/
int LocateNote(SeqList *L,int x){for(int i = 0; i < L->length; i++){if (L->data[i] == x) {return i+1;}}return 0;
}

创建一个测试的文件Linear.c,代码如下:

#include <stdio.h>
#include "E:/Dev/C/DataStructure/chapter2/SeqList.c"int main(){int a[] = {1,2,3,4,5,6,7,8,9,10};SeqList L,*Q;Q = &L;InitList(Q,a,10);InsertList(Q,5,55);int delete = DeleteList(Q,5);int location = LocateNote(Q,5);printf("delete=%d, locate=%d\n",delete,location);printf("执行结束");return 0;
}

这里面要注意的是,引用SeqList.c文件,要填写全路径,否则会找不到的。

执行gcc -o main Linear.c -L SeqList.c

将SeqList.c头文件与Linear.c关联起来。生成main.exe文件,执行./main.exe运行main.exe。输出如下:

例子

1、已知一长度为n 顺序存储的线性表,试写一算法将该线性表逆置。

/*将顺序表倒逆*/
void Inverse(SeqList *L){int half = L->length / 2;int length = L->length;for (int i = 0; i < half; i++){DataType tem = L->data[i];L->data[i] = L->data[length - i -1];L->data[length-i-1] = tem;}PrintfList(L->data, length);
}

执行:

int main(){int a[] = {1,2,3,4,5,6,7,8,9,10};SeqList L, *Q;Q = &L;InitList(Q, a, 10);Inverse(Q);return 0;
}

执行结果:

打印数组
1 2 3 4 5 6 7 8 9 10
打印数组
10 9 8 7 6 5 4 3 2 1

2、试写一算法,实现在顺序表中找出最大值和最小值及其元素所在的位置

使用指针找到最大最小值的指针,然后根据值值获得位置。

/*找出表中最大值最小值的元素的指针*/
void FindMaxMin(SeqList *L, DataType *max, DataType *min){int length = L->length;*max = *min = L->data[0];for (int i = 1; i < length; i++){if (L->data[i] > *max){*max = L->data[i];}else if (L->data[i] < *min){*min = L->data[i];}}
}

执行:

int main(){int a[] = {10,2,3,4,5,1,6,7,8,9};SeqList L, *Q;Q = &L;InitList(Q, a, 10);// Inverse(Q);DataType max, min, *pMax, *pMin;pMax = &max;//最大值的指针pMin = &min;//最小值的指针FindMaxMin(Q, pMax, pMin);int lMax = LocateNote(Q, *pMax);//根据指针值获得位置int lMin = LocateNote(Q, *pMin);printf("最大位置:%d, 最小位置:%d\n", lMax, lMin);printf("最大值:%d, 最小值:%d\n", *pMax, *pMin);return 0;
}

结果:

打印数组
10 2 3 4 5 1 6 7 8 9
最大位置:1, 最小位置:6
最大值:10, 最小值:1

上面借用了位置获得LocateNote的方法,也可以直接声明四个指针分别代表最大最小值和最大最小值得位置:

/*找出顺序表中最大最小值及最大最小值的位置*/
void FindMaxMinAndLocation(SeqList *L, DataType *max, DataType *min, DataType *maxLocation,DataType *minLocation){*max = *min = L->data[0];  //默认最大最小值为数组第一个*maxLocation = *minLocation = 1; //默认位置为1for (int i = 1; i < L->length; i++){if (L->data[i] > *max){*max = L->data[i];*maxLocation = i+1; //表的位置从1开始的,所以要加1}else if (L->data[i] < * min){*min = L->data[i];*minLocation = i+1; //表的位置从1开始的,所以要加1}}
}

好了,顺序表的基本操作终于写好了。虽然不难,因为刚开始写c语言,中途也是困难重重。
也遇到了两个bug,也都记录下来了 。https://blog.csdn.net/sjdjdjdjahd/article/details/89508983

一、线性表的顺序存储和基本运算相关推荐

  1. 实验一 线性表的顺序存储与实现_【自考】数据结构中的线性表,期末不挂科指南,第2篇

    线性表 这篇博客写的是线性表相关的内容,包括如下部分,先看下有木有期待 啥是线性表 线性表的顺序存储 线性表的基本运算在顺序表上的实现 线性表的链式存储 线性表的基本运算在单链表上的实现 循环链表与双 ...

  2. 线性表的定义和基本运算之线性结构

    一.线性表的逻辑定义和性质 线性表是最简单和最常用的一种数据结构,他是由n个数据元素(结点)a1,a2,a3,a4........an组成的有限序列.其中,数据元素个数那位表的长度.当n为0时称为空表 ...

  3. 数据结构和算法:(3)3.1线性表的顺序存储结构

    -----------------------1.线性表基础操作------------------------ 线性表:(List)由零个或多个数据元素组成的有限序列. 首先他是一个序列,元素之间是 ...

  4. java实现线性表的顺序存储

    今天复习数据结构,按照疯狂java,自己敲了一遍线性表的顺序存储,为了下次看方便,在这里保留一份. package mysequence;import java.util.Arrays; /*** @ ...

  5. C和C++线性表的顺序存储结构

    C和C++线性表的顺序存储结构 基本概念 设计与实现 优点和缺点 基本概念 设计与实现 插入元素算法 判断线性表是否合法 判断插入位置是否合法 把最后一个元素到插入位置的元素后移一个位置 将新元素插入 ...

  6. 《数据结构》c语言版学习笔记——线性表的顺序存储结构

    线性表的顺序存储结构 第一章 线性表的顺序存储结构 文章目录 线性表的顺序存储结构 前言 一.顺序存储结构的建立 1.条件 2.代码 二.顺序存储结构的获得元素 1.条件 2.代码 三.顺序存储结构的 ...

  7. 线性表的顺序存储结构之顺序表类的实现_Java

    在上一篇博文--线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构--顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放 ...

  8. 数据结构开发(3):线性表的顺序存储结构

    0.目录 1.线性表的本质和操作 2.线性表的顺序存储结构 3.顺序存储结构的抽象实现和具体实现 3.1 SeqList 3.2 StaticList 和 DynamicList 4.顺序存储线性表的 ...

  9. 实验一 线性表的顺序存储与实现_数据结构篇之单链表的创建以及实现

    上次咱们已经一起分享了线性表的顺序存储的基本创建以及一些运算方法的实现,那么这次咱们主要来研究线性表的链式存储,俗称单链表,咱们知道顺序表在建立的时候要注意需要建立一块连续的空间,所以需要使用数组在内 ...

最新文章

  1. 文件管理服务器主机,通过BlueHost主机文件管理器上传文件
  2. Learning Perl 8
  3. jQuery技术内幕电子版4
  4. 【Python】skimage模块
  5. storm 动态设置并发度
  6. java集合框架的结构_集合框架(Collections Framework)详解及代码示例
  7. 无为职业学校计算机班,致盐亭职中2000级计算机三班全体同学的一封信
  8. Qt之线程同步(生产者消费者模式 - QWaitCondition)
  9. java sftp 公开键设定_如何使用JSch SFTP库解析Java UnknownHostKey?
  10. 一个Form中2个按钮,PHP后台如何判断提交的是哪一个按钮
  11. 打工人的健康修炼记:2021卷里求生(附报告下载)
  12. opensuse13.1 安装 SqliteMan
  13. Aegisub与TCAX识别函数变量写法上的差异
  14. 使用调式音阶即兴 一
  15. 【教学类-34-01】拼图(运动项目-长方块拼图)3*4格子(中班主题《个别化拼图》健康偏艺术-美术)
  16. 开机黑屏且显示the GNU GRUB version grub>命令行解决办法
  17. 通达信 服务器 修改,通达信金融交易终端(开心果交易版)V2020版,修改导航菜单...
  18. 华为路由器(可网管)连接光猫配置(光猫为路由模式)
  19. apache虚拟服务器搭建,httpd搭建虚拟主机与Apache网站基础服务
  20. 区块链难理解?这里有一篇初学者指南

热门文章

  1. 数据分析中的漏斗模型
  2. 学会感恩,学会分享,开始总结自己的职场经验
  3. Ninja ripper 工具使用教程
  4. 野生的男人,家养的猪
  5. 被ddos攻击了怎么办,阿里云高防又太贵了
  6. 寂寞约会吧客服务器的微信是多少钱,约会专家倪淙岩:72招教你如何微信撩妹...
  7. 006-基于hyperledger fabric1.4( 官方文档)编写第一个应用【外部nodejs调用】
  8. SDUT 2021 Spring Individual Contest(for 20) - 1
  9. Gym - 101350E - Competitive Seagulls (博弈)
  10. 推荐一款制作H5页面的可视化工具