数据结构:顺序表的基本操作

article/2025/9/13 23:53:48

          • 线性表的顺序存储
          • 顺序表的线性存储示意图
          • C语言定义线性表的顺序存储结构
          • 顺序表的基本操作
          • 顺序表的基础操作完整代码

线性表的顺序存储

       线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表在逻辑结构上相邻的元素存储在连续的物理存储单元中,即:通过数据元素物理存储的连续性来反应元素之间逻辑上的相邻关系。采用顺序存储结构存储的线性表通常简称为顺序表。
       顺序存储的线性表的特点:
◆ 线性表的逻辑顺序与物理顺序一致;
◆ 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。


顺序表的线性存储示意图

这里写图片描述
       假设线性表中有n个元素,每个元素占k个存储单元,第一个元素的地址为Loc(a1),则第i个元素的地址Loc(ai):

       Loc(ai) = Loc(a1) + (i-1) * k;
其中Loc(a1)称为基地址。


C语言定义线性表的顺序存储结构
#define ListSize 100      //线性表的最大长度
typedef int DataType;typedef struct
{DataType data[ListSize];   //用数组存储线性表中的元素DataType length;           //顺序表中元素的个数
}SeqList, *PSeqList;

       DataType是数据元素类型,可以根据需要定义,可以使用SeqList定义数据表类型变量,使用*PSeqList定义数据表指针变量;


顺序表的基本操作

(1) 顺序表的初始化

       顺序表的初始化就是把顺序表 初始化为空的顺序表;只需把顺序表的长度length置为0即可;

void InitList(PSeqList L)
{if (L == NULL){return;}L->length = 0;
}

(2)求顺序表的长度

       顺序表的长度就是就顺序表中的元素的个数,由于在插入和删除操作中都有对数据表的长度进行修改,所以求表长只需返回length的值即可;

int LengthList(PSeqList L)
{if (L == NULL){return 0;}return L->length;
}

(3)按序号查找
       查找顺序表中第i个元素的值(按序号查找),如果找到,将将该元素值赋给e。查找第i个元素的值时,首先要判断查找的序号是否合法,如果合法,返回第i个元素对应的值。

int GetData(PSeqList L, int i)
{if (L->length < 1 || (L->length > LengthList(L))){return 0;}//数据元素的序号从1开始,数组下表从0开始,第i个元素对应的数组下标为i-1;return L->data[i - 1];
}

(4)插入操作
       在数据表的第i个位置插入元素,在顺序表的第i个位置插入元素e,首先将顺序表第i个位置的元素依次向后移动一个位置,然后将元素e插入第i个位置,移动元素要从后往前移动元素,即:先移动最后一个元素,在移动倒数第二个元素,依次类推;插入元素之前要判断插入的位置是否合法,顺序表是否已满,在插入元素之后要将表长L->length++;

int InsList(PSeqList L, int i, DataType e)
{//判断插入位置是否合法if (i < 1 || L->length >(LengthList(L) + 1)){printf("插入位置不合法!\n");return 0;}//判断顺序表是否已满else if (L->length >= ListSize){printf("顺序表已满,不能插入!\n");return 0;}else{for (k = i; k <= L->length; k--){L->data[k + 1] = L->data[k];}L->data[i - 1] = e;L->length++;   //数据表的长度加1return 1;}return 0;
}

(5) 删除操作

       删除表中的第i个元素e,删除数据表中的第i个元素,需要将表中第i个元素之后的元素依次向前移动一位,将前面的元素覆盖掉。移动元素时要想将第i+1个元素移动到第i个位置,在将第i+2个元素移动i+1的位置,直到将最后一个元素移动到它的前一个位置,进行删除操作之前要判断顺序表是否为空,删除元素之后,将表长L->length--;

int DelList(PSeqList L, DataType i, DataType* e)
{if (L->length < 1){printf("表为空!\n");return  0;}*e = L->data[i - 1];for (k = i; k < L->length; k++){L->data[k - 1] = L->data[k];}L->length--;return *e;
}

(6)按内容查找

       查找数据元素e在表中的位置,可以从表头开始一直遍历表中元素,如果找到与要查找元素e相等的元素,则返回元素在表中的位置,数组下标从0开始,则元素在表中对应的位置序号值应为对应数组下标加1,没有找到则返回0;

int Locate(PSeqList L, DataType e)
{for (k = 0; k < L->length; k++){if (L->data[k] == e){//k为e对应的数组下标,在表中对应序号应为k+1return k + 1;}}return 0;
}

(7)头插

       头插,即在表头插入元素e,在表头插入元素,需要将表中的元素依次后移一位,然后将要插入的元素e赋给数字的首元素,执行插入操作后将表长L->length++;需要注意的是移动元素要从顺序表的最后一个元素开始移动,如果从第1个元素开始移动,会使得第1个元素的值覆盖第2个元素的值,然后把第二个元素后移则会使第2个元素的值(原来第1个元素值)覆盖第3个元素的值,依次类推,最后出插入元素外,其余元素值均为原顺序表中第一个元素的值。

void PushFront(PSeqList L, DataType e)
{if (L->length == ListSize){printf("顺序表已满,不能插入!\n");}//将表中元素依次后移一位for (k = L->length; k > 0; k--){L->data[k] = L->data[k - 1];}//插入元素L->data[0] = e;L->length++;
}

(8)头删

       删除顺序表中的第一个元素,只要将顺序表中的元素从第2个开始,依次向前移动1位,覆盖原来顺序表中元素对应位置的前一个值,在删除元素之前要判断顺序表是否为空,删除顺序表元素之后将顺序表长度L->length--;

void PopFront(PSeqList L)
{if (EmptyList(L)){printf("顺序表为空\n");}for (k = 1; k <= L->length - 1; k++){L->data[k - 1] = L->data[k];}L->length--;
}

(9)尾插

       在顺序表表尾插入元素e,L->data[L->length] = e;将元素e的值赋给顺序表中最后一个元素的下一个元素;尾插操作,需要判断顺序表是否已满,尾插后将顺序表长度L->length++;

void PushBack(PSeqList L, DataType e)
{if (L->length == ListSize){printf("顺序表已满,不能插入!\n");}L->data[L->length] = e;L->length++;
}

(10) 尾删

       删除表尾元素,只需将顺序表的长度减1,类似于出栈操作,栈顶指针top –。

void PopBack(PSeqList L)
{if (EmptyList(L)){printf("表为空!\n");}L->length--;}

(11) 清空顺序表

       清空顺序表就是将表中的元素删除。删除表中的元素只需将表的长度置为0。

void ClearList(PSeqList L)
{L->length = 0;
}

(12)判断表是否为空

       如果顺序表的长度为0,则顺序表为空,返回1,否则,返回0;

int EmptyList(PSeqList L)
{if (L->length == 0){return 1;}return 0;
}

(13)打印表中元素

       依次打印顺序表中的元素,如果顺序表为空则输出提示。

void PrintList(PSeqList L)
{if (EmptyList(L)){printf("表为空!\n");return;}for (k = 0; k < L->length; k++){printf("%-3d", L->data[k]);}printf("\n");
}
顺序表的基础操作完整代码

SeqList.h数据结构的定义和基本操作函数声明

#pragma once#define ListSize 100      //线性表的最大长度
typedef int DataType;typedef struct
{DataType data[ListSize];   //用数组存储线性表中的元素DataType length;           //顺序表的长度
}SeqList, *PSeqList;void InitList(PSeqList L);  //顺序表的初始化操作
int LengthList(PSeqList L); //求顺序表的长度
int GetData(PSeqList L, int i); //返回数据表中第i个元素的值
int InsList(PSeqList L, int i, DataType e);   //在顺序表的第i个位置插入元素
int DelList(PSeqList L, DataType i, DataType* e); //删除顺序表L的第i个数据元素
int Locate(PSeqList L, DataType e); //查找数据元素e在表中的位置
void PushFront(PSeqList L, DataType e); //头插,在表头插入元素e
void PopFront(PSeqList L);    //头删,删除表中的第一个元素
void PushBack(PSeqList L, DataType e);  //尾插,在表尾插入元素e
void PopBack(PSeqList L); //尾删,删除表尾元素
void ClearList(PSeqList L);  //清空顺序表
int EmptyList(PSeqList L);   //判断顺序表是否为空
void PrintList(PSeqList L);  //打印表中元素

SeqList.c 函数的具体实现

#include <stdio.h>
#include "SeqList.h"int k = 0;  //全局变量,用于作部分操作的循环变量
//初始化顺序表
void InitList(PSeqList L)
{if (L == NULL){return;}L->length = 0;
}//求顺序表的长度int LengthList(PSeqList L)
{if (L == NULL){return 0;}return L->length;
}//返回数据表中第i个元素的值
int GetData(PSeqList L, int i)
{if (L->length < 1 || (L->length > LengthList(L))){return 0;}//数据元素的序号从1开始,数组下表从0开始,第i个元素对应的数组下标为i-1;return L->data[i - 1];
}//在L中第i个位置,插入新的数据元素eint InsList(PSeqList L, int i, DataType e)
{//判断插入位置是否合法if (i < 1 || L->length >(LengthList(L) + 1)){printf("插入位置不合法!\n");return 0;}//判断顺序表是否已满else if (L->length >= ListSize){printf("顺序表已满,不能插入!\n");return 0;}else{for (k = i; k <= L->length; k--){L->data[k + 1] = L->data[k];}L->data[i - 1] = e;L->length++;   //数据表的长度加1return 1;}return 0;
}//删除L的第i个数据元素int DelList(PSeqList L, DataType i, DataType* e)
{if (L->length < 1){printf("表为空!\n");return  0;}*e = L->data[i - 1];for (k = i; k < L->length; k++){L->data[k - 1] = L->data[k];}L->length--;return *e;
}//查找e在表中的位置int Locate(PSeqList L, DataType e)
{for (k = 0; k < L->length; k++){if (L->data[k] == e){//k为e对应的数组下标,在表中对应序号应为k+1return k + 1;}}return 0;
}//头插,在表头插入元素evoid PushFront(PSeqList L, DataType e)
{if (L->length == ListSize){printf("顺序表已满,不能插入!\n");}//将表中元素依次后移一位for (k = L->length; k > 0; k--){L->data[k] = L->data[k - 1];}//插入元素L->data[0] = e;L->length++;
}//头删,删除顺序表中的第一个元素,把顺序表中的元素依次往前移动一位void PopFront(PSeqList L)
{if (EmptyList(L)){printf("顺序表为空,不能插入!\n");}for (k = 1; k <= L->length - 1; k++){L->data[k - 1] = L->data[k];}L->length--;
}//尾插
void PushBack(PSeqList L, DataType e)
{if (L->length == ListSize){printf("顺序表已满,不能插入!\n");}L->data[L->length] = e;L->length++;
}//尾删
void PopBack(PSeqList L)
{if (EmptyList(L)){printf("表为空!\n");}L->length--;}//清空顺序表
void ClearList(PSeqList L)
{L->length = 0;
}//判断表是否为空int EmptyList(PSeqList L)
{if (L->length == 0){return 1;}return 0;
}//打印表中元素void PrintList(PSeqList L)
{if (EmptyList(L)){printf("表为空!\n");return;}for (k = 0; k < L->length; k++){printf("%-3d", L->data[k]);}printf("\n");
}

mian.c函数的简单测试代码

#include <stdio.h>
#include <Windows.h>
#include "SeqList.h"int main()
{SeqList L;DataType data;//初始化顺序表InitList(&L);//在表中插入元素printf("依次在表中插入元素(1,2,3,4,5):\n");InsList(&L, 1, 1);InsList(&L, 2, 2);InsList(&L, 3, 3);InsList(&L, 4, 4);InsList(&L, 5, 5);//打印表中元素printf("表中元素有:\n");PrintList(&L);//头插printf("在表头依次插入元素,6,7:\n");PushFront(&L, 6);PushFront(&L, 7);//尾插printf("在表尾依次插入元素,8,9:\n");PushBack(&L, 8);PushBack(&L, 9);printf("表中元素有:\n");PrintList(&L);//头删printf("头删一个元素:\n");PopFront(&L);//尾删printf("尾删一个元素:\n");PopBack(&L);//输出表中第4个元素值PrintList(&L);printf("表中第4个元素值为:\n%d\n",GetData(&L, 4));//查找表中第 i个元素的位置printf("元素2在表中的位置为:\n");printf("%d\n",Locate(&L, 2));//删除表中第2个元素对应的值printf("删除表中第2个元素:%d\n", DelList(&L, 2, &data));printf("顺序表的长度为:%d\n", LengthList(&L));printf("表中元素为:\n");PrintList(&L);//printf("删除的元素值为:%d\n", data);//清空顺序表ClearList(&L);PrintList(&L);system("pause");return 0;
}

http://chatgpt.dhexx.cn/article/sZCDHvvs.shtml

相关文章

顺序表的基本操作(C语言)

1.要求 编程实现顺序表的基本操作&#xff0c;并设计一个菜单调用。 ①建立&#xff08;初始化&#xff09;、遍历、取值、查找、插入、删除 ②判空、求元素个数、前驱、后继、置为空表、销毁 2.分析 我们需要去定义一个结构体&#xff08;以下代码的结构体名为SqList),其…

C语言实现顺序表基本操作

1.顺序表初始化 2.顺序表创建 3.求顺序表的长度 4.判断顺序表是否为空 5.向顺序表中插入元素 6.删除顺序表中元素 7.将顺序表翻转 8.将顺序表降序排序 #include<stdio.h> #define MAXSIZE 100//定义顺序表的最大存储个数 typedef struct SqList {int *base;int l…

顺序表基本操作

文章目录 1. 顺序表插入元素2. 顺序表删除元素3. 顺序表查找元素4. 顺序表更改元素 1. 顺序表插入元素 向顺序表中插入数据元素&#xff0c;根据插入位置的不同&#xff0c;可分为以下 3 种情况&#xff1a; 插入到顺序表的表头&#xff1b;在表的中间位置插入元素&#xff1…

顺序表的基本操作

一、实验目的&#xff1a; 1、复习C语言程序设计中的知识。 2、掌握线性表的顺序存储结构的表示和实现方法。 3、掌握顺序表基本操作的算法实现。 二、实验内容&#xff1a; 1&#xff0e;建立顺序表。 2&#xff0e;在顺序表上实现插入、删除和查找等操作。 三、实验要求…

数据结构-顺序表基本操作的实现(含全部代码)

今天起开始编写数据结构中的各种数据结构及其算法的实现。 主要依据严蔚敏版数据结构教材以及王道数据结构考研辅导书。 今天是线性表中的顺序表的实现&#xff0c;主要实现函数如下&#xff0c;读者有需要可以评论&#xff0c;我可以适当加几个。 CreateList(SqList &L…

PTA题目:顺序表基本操作

实现顺序表的基本操作&#xff0c;如初始化、插入、删除、输出等。 注意&#xff1a;顺序表中可有重复元素值。 要求&#xff1a;写出三个基本操作函数ListInsert&#xff0c;ListDelete&#xff0c;ListDeleteElem。 顺序表结构与操作函数接口定义&#xff1a; typedef char…

顺序表的操作,你真的学会了吗?

&#x1f30d;新人小白的博客 ⌛️希望大家多多关注 &#x1f383;以后会经常更新哒~&#x1f648; ⭐️个人主页&#xff1a; 收藏加关注&#xff0c;永远不迷路~ ⭐️ 顺序表的操作 前言一、目的二、步骤1.定义存储表示2. 定义操作函数3.采用菜单样式让操作更加方便清楚。4. …

数据结构——顺序表的基本操作

目录 1.顺序表的定义 2.define和typedef 3.以下所有用到函数的声明 4.建表&#xff0c;为表开放空间 5.建表&#xff0c;并且输入表内的值 6.在L中第i个位置之前查人新的数据元素e&#xff0c;L的长度加1 7.删除L的第i个数据元素&#xff0c;并用e返回其值&#xff0c;L的…

顺序表基本操作算法——基础代码(C语言)

创建一个顺序表&#xff08;数据元素个数为5&#xff09;&#xff0c; 输出顺序表中的所有数据元素 查找第3个位置上的元素 查找元素15是否在顺序表中&#xff0c;如果在&#xff0c;请输出该元素在顺序表中的位置 在顺序表中的第1个位置插入数据0 删除刚刚插入的元素 输出顺序…

顺序表的十个基本操作(全)

目录 一、初始化顺序表 二、插入 三、删除 3.1 按位删除 3.2 按数删除 四、查找 4.1 按位查找 4.2 按数查找 五、修改 5.1 按位修改 5.2 按数修改 六、逆置 七、排序 八、按序插入 九、按序合并 十、最小值 完整代码 一、初始化顺序表 初始化并一个顺序表&am…

数据结构—顺序表基本操作的实现(C语言)

前言 本文介绍线性表顺序存储时基本操作的实现&#xff0c;包括顺序表的结构定义、初始化、插入、删除、销毁、显示、清空、判空、求长度、查找&#xff0c;以及线性表的合并。 主要参考&#xff1a;严蔚敏“数据结构及应用算法教程”教材 代码如下 #include <stdio.h>…

顺序表的基本操作(超详细)

1.顺序表的定义 使用结构体来构造一个顺序表。 typedef struct {int length;//当前顺序表长度int Maxsize;//顺序表最大长度int* data;//定义顺序表中元素类型的数组指针 }SqList;2.顺序表的初始化 顺序表的初始化是使用动态分配数组空间方式构造一个空的线性表。 #include&…

多组比较的非参数检验——K-W检验

作者&#xff1a;丁点helper 来源&#xff1a;丁点帮你 前面我们已经讲完两组比较的非参数检验&#xff0c;类似t检验与方差分析&#xff0c;当比较的数据超过两组时&#xff0c;我们就需要换一个方法了。 非参数K-W检验&#xff0c;相比前文讲解的Mann-Whitney 检验就是这样…

推断统计:参数估计和假设检验

目录 1、总体、个体、样本和样本容量    1&#xff09;总体、个体、样本和样本容量的概念    2&#xff09;本文章使用的相关python库   2、推断统计的概念    1&#xff09;推断统计的概念    2&#xff09;为什么要进行推断统计&#xff1f;   3、参数估计(点…

非参数检验之符号检验、Wilcoxon符号秩检验、游程检验

目录 一、符号检验 例2.1下面是世界上71个大城市的花费指数(包括租金)按递增次序排列如下(这里上海是44位&#xff0c;其指数为63.5&#xff09;&#xff1a; R代码&#xff1a; 二、Wilcoxon符号秩检验 例2.3下面是10个欧洲城镇每人每年平均消费的酒类相当于纯酒精数&…

SPSS非参数检验

系列文章目录 SPSS描述统计 SPSS均值检验 SPSS方差分析 文章目录 系列文章目录前言1 非参数检验提出的背景与特点1.1 背景1.2 特点 2 SPSS分析-非参数检验菜单中的相关功能2.1 卡方检验2.1.1 概述2.1.2 操作流程2.1.3 实例操作 2.2 二项分布检验2.2.1 概述2.2.2 操作流程2.2.3…

入门必学 | R语言参数检验之t检验与方差分析

T检验与方差分析 背景介绍R语言实操过程--t test单样本t检验两个独立样本t检验配对t检验 R语言实操过程--anova单因素方差分析多重比较 双因素方差分析 完整代码 之前与大家分享了数据的独立性、正态性、方差齐性检验。如果还不清楚&#xff0c;大家可以通过这篇推文来学习和理…

R语言对数据进行非参数检验

假设检验&#xff1a;参数检验运用样本的统计量来估计总体的参数&#xff0c;如用样本均值估计总体均值&#xff0c;用样本标准差估计总体标准差。 非参数检验则不考虑数据的具体值&#xff0c;而更多地运用了数据大小排序的信息&#xff0c;因此不可能以此估计总体的参数 1.原…

SPSS参数检验、非参数检验、方差分析

参数检验、非参数检验、方差分析 1.导语2.参数检验2.1 数据分布2.1.1 正态分布1.有总体数据2.没有总体数据&#xff0c;用样本3.统计参数 2.1.2 指数分布1.有总体数据2.没有总体数据&#xff0c;样本3.统计参数 2.2 单样本t检验2.2.1 单样本t检验目的2.2.2 SPSS操作 2.3 两独立…

SPSS学习笔记(四)非参数检验

目录 一、配对&#xff1a;Wilcoxon符号-秩检验 分析 操作 结果及分析 二、独立样本&#xff1a;Mann-Whitney U检验 分析 操作 结果及分析 三、单因素ANOVA&#xff1a;Kruskal-Wallis检验 分析 操作 结果及分析 一、配对&#xff1a;Wilcoxon符号-秩检验 分析&a…