数据结构之顺序存储-顺序表的基本操作c/c++(创建、初始化、赋值、插入、删除、查询、替换、输出)
学习参考博文:http://t.csdnimg.cn/Qi8DD
学习总结,同时更正原博主在顺序表中插入元素的错误。
数据结构顺序表——基本代码实现(使用工具:VS2022):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define Size 7
//建表语句
typedef struct
{
int* elem; //定义数组,动态分配
int length;//定义数组的长度
int size; //定义数组的分配空间
}Sqlist;
//初始化线性结构顺序表
Sqlist InitList(Sqlist& L) //返回类型为结构体
{
L.elem = (int *)malloc(Size * sizeof(int));
if (!L.elem)
printf("申请储存空间失败");
L.length = 0;
L.size = Size; //初始化顺序表的空间和长度
return L;
}
//顺序表赋值
Sqlist assignment(Sqlist& L)
{
int i;
for (i = 0; i < L.size-2; i++)//给顺序表分配五个字符空间
{
L.elem[i] = i + 1;
L.length++; //顺序表长度
}
return L;
}
//输出顺序表储存情况
Sqlist Export(Sqlist L)
{
printf("顺序表储存的情况如下:");
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
return L;
}
//插入数据
void ListInsert(Sqlist& L,int i, int e) //i是插入的位置,e是插入的元素
{
if (i<1 || i>L.length + 1) //判断插入的数据是否合法
exit(0);
if (L.length >= Size) //判断表的存储空间是否已满
exit(0);
for (int j = L.length - 1; j >= i - 1; j--)
L.elem[j + 1] = L.elem[j]; //将第n位至第i位元素依次向右移动一个位置
L.elem[i - 1] = e; //将新元素e放到第i个位置
L.length++; //表长增加1
}
//删除元素
bool ListDelete(Sqlist& L, int i,int &e)
{
if (i<1 || i>L.length)
return false;
e = L.elem[i - 1];
for (int j = i; j <= L.length - 1; j++)
L.elem[j - 1] = L.elem[j];
L.length--;
return true;
}
//查找元素
int LocateElem(Sqlist L, int e)
{
for (int i = 0; i < L.length; i++)
{
if (L.elem[i] == e)
return i + 1; //找到了,返回元素的位置
}
return 0; //没找到,返回0
}
//替换指定数据
Sqlist Replace(Sqlist L, int a, int b)//将a替换成b
{
int i = LocateElem(L, a);
L.elem[i - 1] = b;
return L;
}
//主函数
int main()
{
Sqlist L;
L = InitList(L);
L = assignment(L);
Export(L);
printf("\n --------------------------- \n");
int i;
int e;
printf("请输入要插入的位置:");
scanf_s("%d", &i);
printf("请输入要插入的元素:");
scanf_s("%d", &e);
if (i > L.size + 1 || i < 0)
{
printf("输入的数据有误\n");
exit(0);
}
ListInsert(L, i, e);
Export(L);//输出顺序表
printf("\n");
printf("\n --------------------------- \n");
printf("请输入删除的位置:");
scanf_s("%d", &i);
if (i > L.size || i < 0)
{
printf("输入的位置错误\n");
exit(0);
}
int a;
ListDelete(L, i,a);
printf("删除的元素是:%d\n", a);
Export(L);
printf("\n --------------------------- \n");
printf("查找5的位置:");//查找5的位置
int b = LocateElem(L, 5);
printf("5的位置是:%d",b);
Export(L);
printf("\n --------------------------- \n");
printf("用 55 替换 5\n");
Replace(L, 5, 55);
Export(L);
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define Size 7
typedef struct {
int* elem;
int length;
int size;
}Sqlist;
//初始化
Sqlist Initlist(Sqlist& L)
{
L.elem = (int*)malloc(Size * sizeof(int));
if (!L.elem)
printf("申请储存空间失败");
L.length = 0;
L.size = Size;
return L;
}
//赋值
Sqlist assignment(Sqlist& L)
{
int i;
int data[5] = { 10,20,30,40,50};
for (i = 0; i < 5; i++)
{
L.elem[i] = data[i];
L.length++;
}
return L;
}
//输出
Sqlist Export(Sqlist L)
{
printf("顺序表储存的情况如下:");
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
return L;
}
//输出顺序表长度
Sqlist LengthList(Sqlist L)
{
printf("顺序表的长度是:%d\n", L.length);
return L;
}
//判断顺序表是否为空
void EmptyList(Sqlist L)
{
if (L.length == 0)
printf("顺序表为空\n");
else
printf("顺序表不为空\n");
}
//输出顺序表的第三个元素
Sqlist OutputList(Sqlist L)
{
printf("顺序表的第三个元素是:%d\n", L.elem[2]);
return L;
}
//输出10的位置
Sqlist LocationList(Sqlist L)
{
int i = 0;
for (i = 0; i < L.length; i++)
{
if (L.elem[i] == 10)
printf("元素10的位置是:%d\n", i + 1);
break;
}
if(i == L.length)
printf("找不到元素10的位置\n");
return L;
}
//插入
void ListInsert(Sqlist& L, int i, int e)//i是插入位置,e是插入元素
{
if (i<1 || i>L.length + 1)
exit(0);
if (L.length >= Size)
exit(0);
for (int j = L.length - 1; j >= i - 1; j--)
{
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
L.length++;
}
//删除
bool ListDelete(Sqlist& L, int i, int &e)
{
if (i<1 || i>L.length + 1)
return false;
e = L.elem[i - 1];
for (int j = i; j <= L.length - 1; j++)
{
L.elem[j - 1] = L.elem[j];
}
L.length--;
return true;
}
//摧毁线性表
void DestoryList(Sqlist& L)
{
if (L.elem)
delete L.elem;
}
int main()
{
Sqlist L;
L = Initlist(L);
L = assignment(L);
L = Export(L);
printf("----------------------------------\n");
L = LengthList(L);
printf("----------------------------------\n");
EmptyList(L);
printf("----------------------------------\n");
L = OutputList(L);
printf("----------------------------------\n");
L = LocationList(L);
printf("----------------------------------\n");
printf("\n");
int i, e;
printf("插入的位置是:");
scanf("%d", &i);
printf("插入的元素是:");
scanf("%d", &e);
ListInsert(L, i, e);
Export(L);
printf("----------------------------------\n");
printf("\n");
printf("请输入要删除的位置:");
scanf("%d", &i);
if (i > L.size || i < 0)
{
printf("删除的位置错误");
exit(0);
}
int a;
ListDelete(L, i, a);
printf("删除的元素是:%d\n", a);
Export(L);
printf("----------------------------------\n");
DestoryList(L);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)