【数据结构】 顺序表的基本操作 (C语言版)

一、顺序表

1、顺序表的定义:

线性表的顺序存储结构,即将表中的结点按逻辑顺序依次存放在一组地址连续的存储单元里。这种存储方式使得在逻辑结构上相邻的数据元素在物理存储上也是相邻的,可以通过数据元素的物理存储位置来反映其逻辑关系。

数据结构中的顺序表是一种线性表,它在计算机内存中以数组的形式保存。顺序表采用顺序存储结构,即将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。这种存储方式使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。

2、顺序表的优缺点:

顺序表的优点是便于随机访问查找,时间复杂度为O(1)。缺点是不便于插入和删除操作,尤其是中间或头部的插入和删除操作,时间复杂度为O(n)。因此,顺序表适用于需要大量访问元素,尾部插入和删除较多的场景。

顺序表的优点:
  1. 存储密度大:数据元素在内存中紧密排列,空间利用率高。
  2. 存取速度快:可以通过下标直接访问任意位置的元素,时间复杂度为O(1)。
  3. 空间连续:一次性申请一定大小的存储空间,便于管理和控制。
顺序表的缺点:
  1. 插入和删除操作效率低下:需要移动大量数据元素,特别是当插入或删除的位置位于中间或头部时,时间复杂度为O(N)。
  2. 长度固定:无法自由扩展或收缩,当元素个数超过预先分配的空间时会导致溢出,而元素个数远少于预先分配的空间时则会造成空间浪费。
  3. 动态调整困难:顺序表的空间必须预先分配,无法根据实际需求动态调整。

二、顺序表的基本操作算法(C语言)

1、宏定义
typedef int Status;
typedef char ElemType;
2、创建结构体
//定义类型
typedef struct {char *elem;int length;
}SqList;
3、顺序表初始化
//初始化
Status InitList_sq(SqList &L){//引用型参数
//	L.elem=new char[10];L.elem=new ElemType[10];if(!L.elem){//exit (-1);exit (OVERFLOW);}L.length=0;return OK;
}
4、顺序表插入

在顺序表L的第 i 个元素之前插入新的元素e

1.找到第i-1个位置   

2.将元素e插入

时间复杂度T(n)=O(n)

顺序表的空间复杂度S(n)=O(1)    没有占用辅助空间

//插入
Status InsertList_sq(SqList &L,int i,ElemType e){if(i<1 || i>L.length+1){return ERROR;}if(L.length==MAXSIZE){return ERROR;}for (int j=L.length-1;j>=i-1;j--){L.elem[j+1]=L.elem[j];}L.elem[i-1] = e;L.length++;return OK;
}
4、顺序表取值 
//取值
Status GetElem(SqList L, int i, ElemType &e){if(i<1 || i>L.length) {return ERROR;}e = L.elem[i-1];return OK;
}
5、求顺序表的长度
//求长度
int GetLength(SqList L){return L.length;
}
6、顺序表查找

//查找
Status LocateElem(SqList L,ElemType e)
{for (int i = 0; i < L.length; i++) {if (L.elem[i] == e)return i + 1;}return 0;
}
7、顺序表删除

插入i-1个位置,删除第i个位置的元素

//删除
Status ListDelete(SqList &L,int i,ElemType &e)
{if ((i<1) || (i>L.length+1)) return ERROR;
//    if (L.length==MAXSIZE) return 0;       //不用判空e = L.elem[i - 1];for (int j=i;j<=L.length-1;j++)             //for (j=i-1;j<=L.length-1;j++)L.elem[j-1]=L.elem[j];             // L.elem[j]=L.elem[j+1];--L.length;return  OK;
}

四、顺序表的全部代码(C语言)

#include <stdio.h>
#include <stdlib.h>#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 10typedef int Status;
typedef char ElemType;//定义类型
typedef struct {char *elem;int length;
} SqList;//顺序表初始化
//int InitList_sq(SqList &L){   //引用型参数
Status InitList_sq(SqList &L) {
//	L.elem=new char[10];L.elem = new ElemType[10];if (!L.elem) {//exit (-1);exit(OVERFLOW);}L.length = 0;
//	return 1;return OK;
}//功能菜单
int choice() {printf("==================================\n");printf("         顺序表操作功能菜单        \n");printf("          1、插入元素            \n");printf("          2、查询表长            \n");printf("          3、按位查找            \n");printf("          4、按值查找            \n");printf("          6、批量插入            \n");printf("          7、退出程序            \n");printf("==================================\n");return 0;
}//顺序表插入
Status InsertList_sq(SqList &L, int i, ElemType e) {if (i < 1 || i > L.length + 1) {return ERROR;}if (L.length == MAXSIZE) {return ERROR;}for (int j = L.length - 1; j >= i - 1; j--) {L.elem[j + 1] = L.elem[j];}L.elem[i - 1] = e;L.length++;return OK;
}//顺序表取值
Status GetElem(SqList L, int i, ElemType &e) {if (i < 1 || i > L.length) {return ERROR;}e = L.elem[i - 1];return OK;
}//求顺序表长度
int GetLength(SqList L) {return L.length;
}//顺序表查找
Status LocateElem(SqList L, ElemType e) {for (int i = 0; i < L.length; i++) {//printf("%c",L.elem[i]);if (L.elem[i] == e)return i + 1;}return 0;
}//顺序表删除
Status ListDelete(SqList &L, int i, ElemType &e) {if ((i < 1) || (i > L.length + 1)) return ERROR;e = L.elem[i - 1];for (int j = i; j <= L.length - 1; j++)         //j=i-1L.elem[j - 1] = L.elem[j];             // L.elem[j]=L.elem[j+1];L.length--;return OK;
}int main() {//printf("Hell Word");//struct List list;SqList sqList;printf("顺序表正在初始化....\n");Status returnStatus = InitList_sq(sqList);if (returnStatus == OK) {printf("顺序表初始化成功!\n");} else {printf("顺序表初始化失败!\n");}choice();while (1) {int flag;printf("请输入所需的功能编号:\n");scanf("%d", &flag);switch (flag) {case 1: {//插入// printf("length = %d \n", sqList.length);// int listLength = GetLength(sqList);// printf("%d ", listLength);int insertLocation;ElemType insertElem;printf("请输入插入元素位置及插入元素(请在英文状态下输入例如:1,a): \n");scanf("%d,%c", &insertLocation, &insertElem);Status insertStatus = InsertList_sq(sqList, insertLocation, insertElem);if (insertStatus == OK) {printf("向顺序表中第%d个位置,插入元素%c成功!\n", insertLocation, insertElem);} else {printf("向顺序表中插入元素失败!\n");}choice();}break;case 2: {//求顺序表的长度printf("顺序表的长度为:%d  。\n", GetLength(sqList));choice();}break;case 3: {//取值Status no;printf("请输入需要查询的元素的位置:\n");scanf("%d", &no);ElemType element;Status GetElemStatus = GetElem(sqList, no, element);//printf("element = %c ", element);printf("在顺序表中第%d个元素为:%c 。 \n", no, element);if (GetElemStatus = OK) {printf("在顺序表中第%d个元素为:%c 。 \n", no, element);} else {printf("查找顺序表中第%d个元素失败。 \n", no);}choice();}break;case 4: {//查找ElemType findElem;printf("请输入想要查找元素:\n");getchar();    //用于接收回车scanf("%c", &findElem);int locate = LocateElem(sqList, findElem);if (locate != 0) {printf("所需查找的元素%c存在于顺序表中,它的在第%d位置。  \n", findElem, locate);} else {printf("所需查找的元素%c不存在于顺序表中!  \n", findElem);}//printf("locate = %d ", locate);choice();}break;case 5: {//删除//ListDelete_DuL(list,1);Status delindex;ElemType delElem;printf("请输入想要删除元素的位置:\n");scanf("%d", &delindex);Status delreturn = ListDelete(sqList, delindex, delElem);if (delreturn == OK) {printf("在顺序表中删除第%d个元素为:%c 。 \n", delindex, delElem);} else {printf("在顺序表中删除第%d个元素失败! \n", delindex);}printf("顺序表的长度为:%d  \n", GetLength(sqList));//printf("delindex = %d ", delindex);choice();}break;case 6: {//批量插入int on;printf("请输入想要插入的元素个数:\n");scanf("%d", &on);ElemType array[on];for (int i = 1; i <= on; i++) {getchar();printf("向顺序表第%d个位置插入元素为:", (i));scanf("%c", &array[i]);}for (int i = 1; i <= on; i++) {Status insertStatus = InsertList_sq(sqList, i, array[i]);if (insertStatus == OK) {printf("向顺序表中第%d个位置,插入元素%c成功!\n", i, array[i]);} else {printf("向顺序表中第%d个位置插入元素失败!\n", i);}}choice();}break;case 7: {//退出程序return 0;}break;default: {printf("输入错误,无此功能,请检查输入:\n\n");}}}
}

五、结果

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/419126.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天龙八部场景编辑器(源码+软件+教程)

天龙八部场景编辑器&#xff0c;里面包括《源码》&#xff0c;《软件》&#xff0c;《教程》&#xff0c;喜欢研究天龙八部的可以下载看看。 天龙八部场景编辑器&#xff08;源码软件教程&#xff09; 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1GWXErav0…

JAVA 算法介绍(一)

1 二分查找 又叫折半查找&#xff0c;要求待查找的序列有序。每次取中间位置的值与待查关键字比较&#xff0c;如果中间位置 的值比待查关键字大&#xff0c;则在前半部分循环这个查找的过程&#xff0c;如果中间位置的值比待查关键字小&#xff0c; 则在后半部分循环这个查…

UKP3d的管道编辑

山西这家用户在使用UKP3d时&#xff0c;提出以下问题&#xff1a; 1、stp导入的模型怎么测量距离&#xff1b;另外需要把某一个点移动至原点坐标&#xff0c;这个怎么操作呢&#xff1f; 回复&#xff1a;dist&#xff08;主要是捕捉点&#xff0c;推荐使用&#xff08;开启精…

Nginx实现html页面注入浏览器监控js代码片段

一、背景 最近看到关于浏览器监控相关的东西&#xff0c;顺带着就记录一下其实现的大致原理过程。 在我们没对web应用做浏览器监控的时候&#xff0c;我们其实无法感知到用户对我们应用页面的使用习惯、使用中是否遇到问题&#xff0c;例如白屏情况出现多少次、请求失败情况、j…

【UEFI基础】EDK网络框架(UDP4)

UDP4 UDP4协议说明 UDP的全称是User Datagram Protocol&#xff0c;它不提供复杂的控制机制&#xff0c;仅利用IP提供面向无连接的通信服务。它将上层应用程序发来的数据在收到的那一刻&#xff0c;立即按照原样发送到网络。 UDP报文格式&#xff1a; 各个参数说明如下&…

两条链表相同位数相加[中等]

优质博文IT-BLOG-CN 一、题目 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字0之外&#xff0c;这…

《WebKit 技术内幕》之五(3): HTML解释器和DOM 模型

3 DOM的事件机制 基于 WebKit 的浏览器事件处理过程&#xff1a;首先检测事件发生处的元素有无监听者&#xff0c;如果网页的相关节点注册了事件的监听者则浏览器会将事件派发给 WebKit 内核来处理。另外浏览器可能也需要处理这样的事件&#xff08;浏览器对于有些事件必须响应…

【机器学习300问】14、什么是特征工程?

当我学习到这个知识点的时候十分困惑&#xff0c;因为从名字中我完全无法理解这个什么东西。于是呢我就去问了一下维基百科&#xff0c;下面是他的回答&#xff1a; 特征工程&#xff08;英语&#xff1a;feature engineering&#xff09;又称特征提取&#xff08;英语&#xf…

消除噪音:Chain-of-Note (CoN) 强大的方法为您的 RAG 管道提供强大动力

论文地址&#xff1a;https://arxiv.org/abs/2311.09210 英文原文地址&#xff1a;https://praveengovindaraj.com/cutting-through-the-noise-chain-of-notes-con-robust-approach-to-super-power-your-rag-pipelines-0df5f1ce7952 在快速发展的人工智能和机器学习领域&#x…

python-基础篇-函数

文章目录 函数基础目标01. 函数的快速体验1.1 快速体验 02. 函数基本使用2.1 函数的定义2.2 函数调用2.3 第一个函数演练思考 2.4 PyCharm 的调试工具2.5 函数的文档注释 03. 函数的参数3.1 函数参数的使用3.2 参数的作用3.3 形参和实参 04. 函数的返回值05. 函数的嵌套调用函数…

Modern C++ 一个例子学习条件变量

目录 问题程序 施魔法让BUG浮出水面 条件变量注意事项 修改程序 问题程序 今天无意中看到一篇帖子&#xff0c;关于条件变量的&#xff0c;不过仔细看看发现它并达不到原本的目的。 程序如下&#xff0c;读者可以先想想他的本意&#xff0c;以及有没有问题&#xff1a; #…

【LeetCode每日一题】2788. 按分隔符拆分字符串

2024-1-20 文章目录 [2788. 按分隔符拆分字符串](https://leetcode.cn/problems/split-strings-by-separator/)思路&#xff1a; 2788. 按分隔符拆分字符串 思路&#xff1a; 对于每个单词&#xff0c;使用一个可变字符串 StringBuilder 来构建拆分后的单词。初始时&#xff0…