数据结构与算法(2)顺序表的初始化、插入、打印、删除、查找元素——C语言版

目录
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 个数据元素,给出删除成功或失败的信息,并输出顺序表中的各元素值。

运行结果如图所示:
在这里插入图片描述

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值