数据结构-顺序表
顺序表
顺序表利用 一块连续的内存单元 依次存储数据元素
顺序表的定义:
#define MAXLEN 10 //开辟的总的存储空间
typedef int DataType; //DataType相当于int的别名
typedef struct {
DataType data[MAXLEN]; //存放顺序表的数据,表示最多可以存储10个元素
int length; //表示顺序表已使用的长度
}SeqList;
创建一个空的顺序表:
//初始化顺序表
void InitList(SeqList *L){
L->length=0; //已使用的长度为0,表示顺序表为空
}
建立一个顺序表:
//创建线性表
void CreateList(SeqList *L,int n){
int i;
printf("请输入%d个整数\n",n);
for(i=0;i<n;i++){
scanf("%d", &L->data[i]);
L->length++;
}
}
例如先在顺序表中添加9个整数7、8、9、10、11、12、13、14、15
此时顺序表的长度应为3
判断顺序表是否为满/是否为空:
void Full(SeqList *L){
if(L->length>=MAXLEN){
printf("顺序表已满");
return -1;
}
}
void empty(SeqList *L){
if(L->length==0){
printf("顺序表为空");
return 0;
}
}
顺序表为满时的状态:
向顺序表中插入数据:
向顺序表中插入数据的前提是: 顺序表不为满
//插入操作
int InsElem(SeqList *L,int i,DataType x)
{
if(i<1 || i>L->length){
printf("插入的位置出错");
return 0;
}
//代表插入位置为表尾
if(i == L->length+1){
L->data[i-1] = x;
L->length++;
return 1;
}
//在指定位置插入数据
for(j=L->length-1;j>=i-1;j--){
L->data[j+1]=L->data[j];
}
L->data[i-1] = x;
L->length++;
return 1;
}
顺序表尾部插入数据:
在指定位置插入数据:
删除指定位置元素
//删除操作
int DelElem(SeqList *L,int i,DataType *x){
int j;
*x = L->data[i-1];
for(j=i;j<L->length;j++){
L->data[j-1] = L->data[j];
}
L->length--;
return 1;
}
全部代码:
#include<stdio.h>
#define MAXLEN 100 //开辟的总的存储空间
typedef int DataType; //DataType相当于int的别名,作用范围为本程序
//定义一个结构体
typedef struct {
DataType data[MAXLEN]; //存放顺序表的数据
int length; //顺序表的长度
}SeqList; //结构体的名称
//初始化顺序表
void InitList(SeqList *L){
L->length=0; //顺序表为空
}
//创建线性表
void CreateList(SeqList *L,int n){
int i;
printf("请输入%d个整数\n",n);
for(i=0;i<n;i++){
scanf("%d", &L->data[i]);
L->length++;
}
}
int GetElem(SeqList *L,int i,DataType *x){
if(i<1||i>L->length)
return 0;
else{
*x=L->data[i-1];
return 1;
}
}
//按值查找
int Locate(SeqList *L,DataType x){
int i=0;
while(i<L->length&&L->data[i]!=x)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
//插入操作
int InsElem(SeqList *L,int i,DataType x)
{
/*在顺序表L中在第i位插入新元素x函数*/
int j;
if(L->length>=MAXLEN){
printf("顺序表已满");
return -1;
}
if(i<1 || i>L->length){
printf("插入的位置出错");
return 0;
}
if(i == L->length){
L->data[i-1] = x;
L->length++;
return 1;
}
for(j=L->length-1;j>=i-1;j--){
L->data[j+1]=L->data[j];
}
L->data[i-1] = x;
L->length++;
return 1;
}
//删除操作
int DelElem(SeqList *L,int i,DataType *x){
int j;
if(L->length==0){
printf("顺序表为空");
return 0;
}
if(i<1 || i>L->length){
printf("不存在第i个元素");
return 0;
}
*x = L->data[i-1];
for(j=i;j<L->length;j++){
L->data[j-1] = L->data[j];
}
L->length--;
return 1;
}
//输出表中的元素操作
void DispList(SeqList *L){
int i;
for(i=0;i<L->length;i++){
printf("%5d",L->data[i]);
}
}
//显示菜单函数
void Menu(){
printf("\n 顺序表的各种操作");
printf("\n===================================");
printf("\n 1.建立顺序表 ");
printf("\n 2.插入元素 ");
printf("\n 3.删除元素 ");
printf("\n 4.按位置查找元素 ");
printf("\n 5.按元素值查找其在表中位置 ");
printf("\n 6.求顺序表的长度 ");
printf("\n 7.返回 ");
printf("\n===================================");
printf("\n请输入菜单号(0-6):");
}
void main(){
SeqList L; //顺序表的名称
DataType x;
int n,i,loc;
char ch1,ch2,a;
ch1 = 'y';
while(ch1=='y'||ch1=='Y'){
Menu();
scanf("%c",&ch2);
getchar();
switch(ch2){
case '1':
InitList(&L);
printf("请输入建立线性表的个数:");
scanf("%d",&n);
CreateList(&L,n);
printf("建立的线性表为:");
DispList(&L);
break;
case '2':
printf("请输入要插入的位置:");
scanf("%d",&i);
printf("请输入要插入的元素值:");
scanf("%d",&x);
if(InsElem(&L,i,x)){
printf("已成功在%d的位置上插入%d,插入后的线性表为:\n",i,x);
DispList(&L);
} else{
printf("输入插入的参数错误");
}
break;
case '3':
printf("请输入要删除的元素的位置:");
scanf("%d",&i);
if(DelElem(&L,i,&x)){
printf("已成功在第%d位置上删除%d,删除后的线性表为:\n",i,x);
DispList(&L);
}else{
printf("\n输入删除的参数错误");
}
break;
case '4':
printf("请输入要删查看表中元素的位置(从1开始):");
scanf("%d",&i);
if(GetElem(&L,i,&x)){
printf("已在当前线性表中的%d的元素的值为:%d\n",i,x);
}else{
printf("\n输入删除的位置错误");
}
break;
case '5':
printf("请输入要查找的元素为:");
scanf("%d",&x);
loc=Locate(&L,x);
if(loc){
printf("查找元素值%d的位置为:%d",x,loc);
}else{
printf("该表中无此元素!");
}
break;
case '6':
printf("当前线性表的长度为:%d",L.length);
break;
case '0':
ch1='n';
break;
default:
printf("输入有误,请输入0~6进行选择");
}
if(ch2!='0'){
printf("\n按回车健继续,按任意键返回主菜单\n");
a=getchar();
if(a!='\xA'){
getchar();
ch1='n';
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!