目录
1.前言
2.头文件的定义
3.菜单栏的设置
4.顺序表的初始化
5.添加元素
6.打印元素
7.查找元素
8.删除元素
9.插入元素
10.主函数
11.完整的代码实现
1.前言
数据结构包括三个方面
- 逻辑结构
- 存储结构
- 运算
而线性表有两种典型的存储结构
- 顺序存储结构
- 链式存储结构
具体关系可参考上一篇博客
https://blog.csdn.net/krotox/article/details/137092821
本节我们学习的是线性表的顺序存储结构
线性表的顺序存储是指使用连续的存储空间,按照数据元素在线性表中的序号依次存储数据元素。
采用这种存储结构的线性表称为:顺序表。
(类似与数组的存储)
主要实现以下目标
- 初始化顺序表
- 添加元素
- 打印元素
- 查找元素
- 删除元素
- 插入元素
2.头文件的定义
#define _CRT_SECURE_NO_WARNINGS//VS2022中防止scanf返回值被忽略
//顺序表操作(顺序表是将所有的元素存放在一个一维数组里面,每个元素都连续存放,但存储方式是随机存放)
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct SeqList
{
int n;//该长度表示顺序表的实际长度
int maxLength;//该长度表示顺序表的最大长度
ElemType* element;//表示指针类型(动态分配)
//也可表示为:ElemType element [maxLength];(静态分配)
}SeqList;
SeqList sq;
2.1函数的声明
void init(SeqList* L, int maxLength);//初始化
void add(SeqList* L);//添加元素
void Print(SeqList* L);//打印元素
void Search(SeqList* L);//查找元素
void Delete(SeqList* L);//删除元素
void Insert(SeqList* L);//插入元素
3.菜单栏的设置
void menu()
{
int option;
printf("----顺序表的基本操作---\n");
printf("----0.初始化顺序表----\n");
printf("----1.添加元素--------\n");
printf("----2.打印元素--------\n");
printf("----3.查找元素--------\n");
printf("----4.删除元素--------\n");
printf("----5.插入元素--------\n");
printf("请输入选择的操作:");
scanf_s("%d", &option);
switch (option)
{
case 0:
init(&sq, 100);
break;
case 1:
add(&sq);
break;
case 2:
Print(&sq);
break;
case 3:
Search(&sq);
break;
case 4:
Delete(&sq);
break;
case 5:
Insert(&sq);
break;
default:
printf("你选择的菜单项不存在,请重新选择\n");
}
system("pause");//暂停,不然控制台程序会一闪即过,你来不及看到执行结果
//system("cls");清屏
}
4.顺序表的初始化
void init(SeqList* L, int maxLen)
{
L->maxLength = maxLen;//指定顺序表的最大长度是maxLen
L->n = 0;//顺序表的实际长度为n
L->element = (ElemType*)malloc(sizeof(ElemType) * maxLen);
if (L->element == NULL)
printf("顺序表初始化失败!\n");
else
printf("顺序表初始化成功!\n");
}
- malloc(m)函数:开辟m字节长度的空间地址,并返回这段空间的首地址
5.添加元素
void add(SeqList* L)
{
ElemType x;//定义一个变量存放输入的元素
int m;//定义一个变量存放输入元素个数
printf("*********添加元素*********\n");
printf("请输入要添加元素的个数:");
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
printf("请输入要添加的元素:");
scanf("%d", &x);
if (L->n < L->maxLength)
{
L->element[L->n] = x;
L->n++;
printf("恭喜,添加成功\n");
}
else if (L->n >= L->maxLength)
{
printf("该顺序表已满,无法添加元素\n");
}
else
{
printf("添加元素失败\n");
}
}
}
6.打印元素
void Print(SeqList* L)
{
ElemType i;
printf("*****打印元素*****\n");
if (L->n > 0)
{
for (i = 0; i < L->n; i++)
{
printf("%d ", L->element[i]);
}
}
else
{
printf("该顺序表是空表,无元素!\n");
}
}
7.查找元素
void Search(SeqList* L)
{
ElemType i, x;
printf("********查找元素********\n");
printf("请输入查找元素的位置:\n");
scanf("%d", &x);//x是查找元素的位置
if (x > L->maxLength || x < 1)
{
printf("输入的位置超过了顺序表的长度\n");
}
else if (L->element[x] != NULL)
{
printf("您查找的元素是%d", L->element[x-1]);
}
else
printf("该顺序表是空表\n");
}
8.删除元素
void Delete(SeqList* L)
{
int i,k,x,flag=0;
printf("********删除元素********\n");
printf("请输入要删除元素的个数:");
scanf("%d", &x);
for(int s=0;s<x;s++)
{
printf("请输入要删除元素的位置:");
scanf("%d", &k);
if (k < L->n && k > 1)
{
for (i = k - 1; i < L->n - 1; i++)
{
L->element[i] = L->element[i + 1];//将后面的元素往前面移1位
}
L->n--;
printf("恭喜您,删除成功\n");
}
else
{
printf("该位置没有元素,删除失败\n");
}
}
}
9.插入元素
void Insert(SeqList* L)
{
int k;
printf("*******插入元素*******\n");
printf("请输入要插入的元素个数:\n");
scanf("%d", &k);
for (int i = 0; i < k; i++)
{
int n;
printf("请输入要插入元素的位置:");
scanf("%d", &n);
if (n<1 || n>L->n+1)
{
printf("抱歉,该位置超出了顺序表的范围\n");
continue;
}
else if (L->n >= L->maxLength)
{
printf("抱歉,顺序表已经溢出了\n");
}
printf("请输入要插入的元素:");
int m = 0;
scanf("%d", &m);
int j = 0;
for (j = L->n; j >= n; j--)
{
L->element[j] = L->element[j - 1];//将前面的元素往后面移1位
}
L->element[n - 1] = m;
L->n++;
printf("恭喜您,插入成功\n");
}
}
10.主函数
int main()
{
while (1)
{
menu();//使程序可以一直进行
}
return 0;
}
11.完整的代码实现
#define _CRT_SECURE_NO_WARNINGS
//顺序表操作(顺序表是将所有的元素存放在一个一维数组里面,每个元素都连续存放,但存储方式是随机存放)
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct SeqList
{
int n;//该长度表示顺序表的实际长度
int maxLength;//该长度表示顺序表的最大长度
ElemType* element;//表示指针类型(动态分配)
//也可表示为:ElemType element [maxLength];(静态分配)
}SeqList;
SeqList sq;
void init(SeqList* L, int maxLength);//初始化
void add(SeqList* L);//添加元素
void Print(SeqList* L);//打印元素
void Search(SeqList* L);//查找元素
void Delete(SeqList* L);//删除元素
void Insert(SeqList* L);//插入元素
void menu()
{
int option;
printf("----顺序表的基本操作---\n");
printf("----0.初始化顺序表----\n");
printf("----1.添加元素--------\n");
printf("----2.打印元素--------\n");
printf("----3.查找元素--------\n");
printf("----4.删除元素--------\n");
printf("----5.插入元素--------\n");
printf("请输入选择的操作:");
scanf_s("%d", &option);
switch (option)
{
case 0:
init(&sq, 100);
break;
case 1:
add(&sq);
break;
case 2:
Print(&sq);
break;
case 3:
Search(&sq);
break;
case 4:
Delete(&sq);
break;
case 5:
Insert(&sq);
break;
default:
printf("你选择的菜单项不存在,请重新选择\n");
}
system("pause");//暂停,不然控制台程序会一闪即过,你来不及看到执行结果
//system("cls");清屏
}
void init(SeqList* L, int maxLen)
{
L->maxLength = maxLen;
L->n = 0;
L->element = (ElemType*)malloc(sizeof(ElemType) * maxLen);
//malloc(m)函数:开辟m字节长度的空间地址,并返回这段空间的首地址
if (L->element == NULL)
printf("顺序表初始化失败!\n");
else
printf("顺序表初始化成功!\n");
}
void add(SeqList* L)
{
ElemType x;//定义一个变量存放输入的元素
int m;//定义一个变量存放输入元素个数
printf("*********添加元素*********\n");
printf("请输入要添加元素的个数:");
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
printf("请输入要添加的元素:");
scanf("%d", &x);
if (L->n < L->maxLength)
{
L->element[L->n] = x;
L->n++;
printf("恭喜,添加成功\n");
}
else if (L->n == L->maxLength)
{
printf("该顺序表已满,无法添加元素\n");
}
else
{
printf("添加元素失败\n");
}
}
}
void Print(SeqList* L)
{
ElemType i;
printf("*****打印元素*****\n");
if (L->n > 0)
{
for (i = 0; i < L->n; i++)
{
printf("%d ", L->element[i]);
}
}
else
{
printf("该顺序表是空表,无元素!\n");
}
}
void Search(SeqList* L)
{
ElemType i, x;
printf("********查找元素********\n");
printf("请输入查找元素的位置:\n");
scanf("%d", &x);//x是查找元素的位置
if (x > L->n || x < 0)
{
printf("输入的位置超过了顺序表的长度\n");
}
else if (L->element[x] != NULL)
{
printf("您查找的元素是%d", L->element[x - 1]);
}
else
printf("该顺序表是空表\n");
}
void Delete(SeqList* L)
{
int i, k, x, flag = 0;
printf("********删除元素********\n");
printf("请输入要删除元素的个数:");
scanf("%d", &x);
for (int s = 0; s < x; s++)
{
printf("请输入要删除元素的位置:");
scanf("%d", &k);
if (k <= L->n)
{
for (i = k - 1; i < L->n - 1; i++)
{
L->element[i] = L->element[i + 1];//将后面的元素往前面移1位
}
L->n--;
printf("恭喜您,删除成功\n");
}
else
{
printf("该位置没有元素,删除失败\n");
}
}
}
void Insert(SeqList* L)
{
int k;
printf("*******插入元素*******\n");
printf("请输入要插入的元素个数:\n");
scanf("%d", &k);
for (int i = 0; i < k; i++)
{
int n;
printf("请输入要插入元素的位置:");
scanf("%d", &n);
if (n<1 || n>L->n + 1)
{
printf("抱歉,该位置超出了顺序表的范围\n");
continue;
}
else if (L->n == L->maxLength)
{
printf("抱歉,顺序表已经溢出了\n");
continue;
}
printf("请输入要插入的元素:");
int m = 0;
scanf("%d", &m);
int j = 0;
for (j = L->n; j >= n; j--)
{
L->element[j] = L->element[j - 1];//
}
L->element[n - 1] = m;
L->n++;
printf("恭喜您,插入成功\n");
}
}
int main()
{
while (1)
{
menu();
}
return 0;
}
编写程序,实现如下操作:
(1) 从键盘上依次输入 21、18、30、75、42、56,创建顺序表,并输出顺序表中的各元素值。
(2) 分别在顺序表的第 3 个位置和第 9 个位置插入 67 和 10,给出插入成功或失败的信息,并输出顺序表中的各元素值。
(3) 删除顺序表中的第 6 个数据元素和第 8 个数据元素,给出删除成功或失败的信息,并输出顺序表中的各元素值。
运行结果如图所示: