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

article/2025/9/14 23:46:13

1.要求 

编程实现顺序表的基本操作,并设计一个菜单调用。

     ①建立(初始化)、遍历、取值、查找、插入、删除

     ②判空、求元素个数、前驱、后继、置为空表、销毁  

2.分析

  我们需要去定义一个结构体(以下代码的结构体名为SqList),其中有一个表示顺序表基位置的elem,和一个表示顺序表长度的length.

  里面的很多操作都与数组操作有很大的相似性。值得注意的是,插入和删除的i取值的范围,在插入中i的取值范围是1至length+1(1和length+1也可),删除是1至length(1和length都可以)

3.代码实现

1)环境:我使用的是DEV C++,在此软件上创建了一个项目。

2)代码

i) 头文件(com_h2.H)

//作用:防止头文件的重复包含和编译 
#ifndef _FUNC_H  //先测试 _FUNC_H是否被宏定义过 
#define _FUNC_H   //如果没有宏定义下面就宏定义_FUNC_H并编译以下语句 //函数结果状态代码 
#define OK 1
#define OVERFLOW -2
#define ERROR 0
#define MAXSIZE 100 //顺序表可能达到的长度typedef int Status; 
typedef int ElemType;//定义顺序表的结构体
typedef struct sqlist {ElemType *elem;  //存储空间的基地址 int length;
}SqList; //定义了一个结构体,名字为Sqlist extern Status InitList(SqList &L); 
extern Status EstablishList(SqList &L,ElemType a[],ElemType n);
extern Status DestroyList(SqList &L);
extern Status ClearList(SqList &L);
extern Status ListEmpty(SqList L);
extern Status ListLength(SqList L);
extern Status GetElem(SqList L,ElemType i,ElemType &e);
extern Status LocateElem(SqList L,ElemType e);
extern Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e);
extern Status NextElem(SqList L,ElemType cur_e,ElemType &next_e);
extern Status ListInsert(SqList &L,ElemType i,ElemType e);
extern Status ListDelete(SqList &L,ElemType i); 
extern Status TraverseList(SqList L); #endif   //如果已经定义了则编译#endif后面的语句 

ii)功能函数(function2.cpp)

#include<stdio.h>
#include<stdlib.h>
#include "com_h2.H"
/*初始化*/ 
Status InitList(SqList &L){L.elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType)); //创建MAXSIZE大小的空间if(!L.elem)	return OVERFLOW;   L.length=0; return OK;	 
}
/*赋值*/ 
Status EstablishList(SqList &L,ElemType a[],ElemType n){L.elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType)); //创建MAXSIZE大小的空间if(!L.elem)	return OVERFLOW;L.length=n;for(int i=0;i<n;i++)L.elem[i]=a[i];return OK;	
}
/*销毁*/
Status DestroyList(SqList &L){free(L.elem);L.length=0;return OK; 
} 
/*清空*/ 
Status ClearList(SqList &L){L.length=0;return OK; 
}
/*判断是否为空表*/
//c语言中除0以外均为真 
Status ListEmpty(SqList L){if(L.length==0)return OK;return ERROR;	 
}
/*返回数据元素个数*/
Status ListLength(SqList L){return L.length; 
} 
/*取值*/ 
/*用e返回L中的第i个元素*/ 
Status GetElem(SqList L,ElemType i,ElemType &e){if(i>L.length||i<1) return ERROR;e=L.elem[i-1];return OK;	 
}
/*查找*/
/*返回L中第1个值与e相同的位置*/
Status LocateElem(SqList L,ElemType e){for(int i=0;i<L.length;i++){if(L.elem[i]==e)return i+1;} return ERROR;
} 
/*求前驱*/
/*返回顺序表中cur_e的前驱元素pre_e*/
Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e){for(int i=1;i<L.length;i++){if(L.elem[i]==cur_e){pre_e=L.elem[i-1];return OK;	}		}return ERROR;
}
/*求后继*/
/*返回顺序表中cur_e的后驱元素next_e*/
Status NextElem(SqList L,ElemType cur_e,ElemType &next_e){for(int i=0;i<L.length-1;i++){if(L.elem[i]==cur_e){next_e=L.elem[i+1];return OK;}}return ERROR;
} 
/*插入*/
/*在第i个前插入e
插入的条件:1.i的范围为1—length+1. length<maxsize */
Status ListInsert(SqList &L,ElemType i,ElemType e){if(i<1||i>L.length+1||L.length==MAXSIZE)return ERROR;for(int j=L.length;j>i-1;j--)L.elem[j]=L.elem[j-1];L.elem[i-1]=e;	L.length++;return OK;
} 
/*删除*/
/*删除第i个位置的值
删除的条件:i的范围是1-length */
Status ListDelete(SqList &L,ElemType i){if(i<1||i>L.length)return ERROR;for(int j=i-1;j<L.length-1;j++)L.elem[j]=L.elem[j+1];L.length--;	return OK;
}
/*遍历顺序表*/ 
Status TraverseList(SqList L){printf("顺序表为:"); for(int i=0;i<L.length;i++)printf("%4d",L.elem[i]); 
}

iii)主函数(function2.cpp)

#include<stdio.h>
#include<stdlib.h>
#include "com_h2.h"int main(int argc, char** argv) {SqList L;ElemType a[MAXSIZE],n,i,order1,order2,e;int cur_e,next_e,pre_e;printf("=======================菜单1========================\n");printf("                  1.初始化顺序表                    \n");printf("                  2.为顺序表赋值                    \n");printf("                  0.退出                            \n");printf("====================================================\n");	do{	printf("请输入你的选择:"); scanf("%d",&order1);switch(order1){case 1:if(!InitList(L))printf("初始化失败!!!\n");elseprintf("初始化成功!!!\n");break;case 2:printf("请输入赋值的个数:");scanf("%d",&n);printf("请输入要赋值的元素值:\n");for(int i=0;i<n;i++)scanf("%d",&a[i]);if(!EstablishList(L,a,n))printf("赋值失败!!!\n");else{printf("创建成功!!!\n");TraverseList(L);printf("\n"); }break;case 0:printf("程序退出!!!\n");	break;					default:printf("输入的选择不合法!!!\n");		}}while(order1!=0&&order1!=1&&order1!=2);do{printf("=========================菜单2==========================\n");printf("   1.获得第i个位置的值        2.查找e在顺序表的位置     \n");printf("   3.在第i个位置插入e         4.删除第i个位置的值       \n");printf("   5.求cur_e的前驱pre_e       6.求cur_e的后继next_e     \n");printf("   7.清空顺序表               8.求表长                  \n");printf("   9.判断顺序表是否为空       10.遍历顺序表             \n");printf("   0.退出程序                                           \n"); printf("========================================================\n"); printf("请输入你的选择:");scanf("%d",&order2);switch(order2){case 1:printf("请输入你要查找的位置i:");scanf("%d",&i);if(!GetElem(L,i,e))printf("i输入错误!!!\n");elseprintf("第%d个位置的值为%d\n",i,e);break;case 2:printf("请输入你要查找的e的值:");scanf("%d",&e);if(!LocateElem(L,e))printf("%d不存在于此顺序表中!!!\n",e);elseprintf("%d在此顺序表的第%d个位置上\n",e,LocateElem(L,e));break;case 3:printf("请输入i和e的值(格式:i,e):");scanf("%d,%d",&i,&e);if(!ListInsert(L,i,e))printf("i输入错误!!!\n");else{printf("插入成功!!!\n");TraverseList(L);printf("\n");	}	break;case 4:	printf("请输入要删除的位置i:");scanf("%d",&i);if(!ListDelete(L,i))printf("删除失败!!!\n");else{printf("删除成功!!!\n");TraverseList(L);printf("\n");}break;							case 5:printf("请输入需要求前驱的元素cur_e:");	scanf("%d",&cur_e);if(!PriorElem(L,cur_e,pre_e))printf("%d不存在前驱!!!\n",cur_e);elseprintf("%d的前驱为%d\n",cur_e,pre_e);break;			case 6:printf("请输入需要求后继的元素cur_e:");	scanf("%d",&cur_e);if(! NextElem(L,cur_e,next_e))printf("%d不存在后继!!!\n",cur_e);elseprintf("%d的后继为%d\n",cur_e,next_e);break;			case 7:ClearList(L);printf("清空成功!!!\n");printf("顺序表的长度为%d\n",L.length);break;case 8:printf("此顺序表的表长为:%d\n",ListLength(L));break;case 9:if(!ListEmpty(L))printf("该顺序表不为空!!!\n");elseprintf("该顺序表为空!!!\n");break;case 10:TraverseList(L);printf("\n");break;case 0:printf("程序退出!!!\n");break;default:printf("输入不合法!!!\n");											} }while(order2!=0);DestroyList(L);		return 0;
}

3)运行结果(DEV)

i)验证创建函数

 ii)验证取值和查找函数(菜单选择中的1和2)

 

 iii)验证插入和删除函数

iiii)验证前驱和后继函数

运行结果大概贴了一些,实在太多了,大家看看就好,可以自己试着运行一下。

4.总结 

       这个实验利用了引用调用代替指针,对我自己来说,更好理解和操作,其余的没有什么新的内容。总的来说,这次实验难度不大,但是代码比较多,还需注意输入不合理的处理,增强算法的健壮性。


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

相关文章

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…

R语言非参数检验多重比较

本文首发于公众号&#xff1a;医学和生信笔记&#xff0c;完美观看体验请至公众号查看本文。 医学和生信笔记&#xff0c;专注R语言在临床医学中的使用&#xff0c;R语言数据分析和可视化。 之前介绍了多个样本均数的多重比较&#xff0c;今天说说kruskal-Wallis H检验后的多重…