数据结构与算法基础篇1-线性表-顺序表的基本操作C++

目录

1、构造顺序结构

2、初始化顺序表

3、获取顺序表的长度

4、顺序表插入结点

5、顺序表删除结点

6、根据序号返回顺序表的数据元素

7、按关键字查询结点

8、显示顺序表中的所有结点

9、菜单

10、主函数展示

11、效果展示


前言:

线性表的顺序存储结构是指用一组地址连续的存储单元依次存储线性表的数据元素,使得线性表中在逻辑结构上相邻的数据元素存储在连续的物理单元中,即线性表中元素的逻辑次序与存储器中的物理次序一一对应,采用顺序存储结构的线性表通常简称为顺序表。

本篇,我们介绍线性表的顺序存储结构 - 顺序表的一些基本操作的实现与其效果 展示!

1、构造顺序结构

#include <stdio.h>
#include <string.h>

#define MAXLEN 5  //定义顺序表的最大长度
#define NULL 0
#define TRUE 1
//定义结点类型
typedef struct
{
	char key[10];   //结点的关键字
	char name[20];  
	int age;
}DataType;  

//定义顺序表结构
typedef struct   
{
	DataType ListData[MAXLEN + 1]; //保存顺序表的结构数组
	int ListLen;                   //顺序表已存结点的数量
}SeqList;

2、初始化顺序表

//初始化顺序表
void InitList(SeqList* L)
{
	L->ListLen = 0;
}

3、获取顺序表的长度

//获取顺序表的长度
int ListLength(SeqList* L)
{
	return L->ListLen;
}

4、顺序表插入结点

//顺序表插入结点
int InsertList(SeqList* L, int i, DataType a)
{
	int k;
	if (i <1 || i > L->ListLen + 1)
	{
		printf("插入的位置不合法!\n");
		return NULL;
	}
	if (L->ListLen > MAXLEN)
	{
		printf("表已满,无法插入!\n");
		return 0;
	}
	for (k = L->ListLen; k >= i; k--)//将顺序表i及其以后的元素向后移动一位
	{
		L->ListData[k + 1] = L->ListData[k];
	}
	L->ListData[i] = a;//插入结点
	L->ListLen++;//顺序表的长度加一
	return TRUE;
}

5、顺序表删除结点

//顺序表删除结点
int DelList(SeqList*  L, int i)
{
	int k;
	if (i<1 || i>L->ListLen+1)//因为数组的范围是1到ListLen+1,所以这里i要大于ListLen加一
	{
		printf("删除的位置不合法!\n");
		return NULL;
	}
	for (k = i + 1; k <= L->ListLen; k++)
	{
		L->ListData[k - 1] = L->ListData[k];//将i节点后面的结点向前移动
	}
	L->ListLen--;//表长减少
	return TRUE;
}

6、根据序号返回顺序表的数据元素

//根据序号返回顺序表的数据元素
DataType* GetData(SeqList* L,int i)
{
	if (i<1 || i>L->ListLen)
	{
		printf("结点序号错误,不能返回结点!\n");
		return NULL;
	}
	return &(L->ListData[i]);
}

7、按关键字查询结点

//按关键字查询结点
int Locate(SeqList* L, char* key)
{
	int i;
	for (i = 1; i <= L->ListLen; i++)
	{
		if (strcmp(L->ListData[i].key,key)==0)
		{
			printf("找到了,下表是:%d", i);
			return TRUE;
		}
	}
	printf("没有找到!\n");
	return NULL;
}

8、显示顺序表中的所有结点

//显示顺序表中的所有结点
int OutPut(SeqList* L)
{
	int i;
	for (i = 1; i <=L->ListLen; i++)
	{
		printf("key=%s\nname=%s\nage=%d\n", L->ListData[i].key , L->ListData[i].name, L->ListData[i].age);
		printf("\n\n");//空俩行
	}
	return 0;
}

9、菜单

//菜单
void menu(void)
{
	printf("------------------------------------------\n");
	printf("     欢迎使用顺序表操作演示!\n");
	printf("     1、初始化顺序表\n");
	printf("     2、往线性表插入结点\n");
	printf("     3、删除线性表结点元素\n");
	printf("     4、查看线性表的结点元素\n");
	printf("     5、根据关键字查看结点\n");
	printf("     6、退出演示!\n");
	printf("-----------------------------------------\n");
	
}

10、主函数展示

int main()
{	
	int i=1;
	int a = 0;
	int n = 0;
	SeqList L;     //定义顺序表变量
	DataType data;  //定义结点保存数据类型变量
	DataType* pdata=0;//定义结点保存指针变量
	char key[10]; //保存关键字
	while (1)
	{
		menu();
		printf("请选择想要进行的操作:\n");
		scanf("%d", &n);
		switch (n)
		{
		case 1:InitList(&L);//初始化顺序表
			printf("初始化顺序表已完成!\n"); break;
		case 2:do
		{
			printf("输入添加的结点(学号,姓名,年龄)输入年龄为0表示退出:\n");//循环添加结点数据
			fflush(stdin);//清除输入缓冲区
			scanf("%s%s%d", &data.key, &data.name, &data.age);
			if (data.age)//若年龄不为0
			{
				if (!InsertList(&L, i++, data))//若添加结点失败
				{
					break;//退出循环
				}
			}
			else//若年龄为0
			{
				break;//退出循环
			}
		} while (1);
		printf("\n顺序表中的结点顺序为:\n");
		OutPut(&L);//显示所有结点数据
		break;
		case 3:fflush(stdin);//清除输入缓冲区
			printf("请输入需要删除的结点:");
			scanf("%d", &a);
			DelList(&L, a);
			printf("\n结点已删除完成!\n");
			OutPut(&L); break;
		case 4:fflush(stdin);//清除输入缓冲区
			printf("\n请输入要查看的结点的序号:");
			scanf("%d", &i);
			pdata = GetData(&L, i);
			if (pdata)
			{
				printf("第%d个结点为:\nkey=%s\nname=%s\nage=%d\n", i, pdata->key, pdata->name, pdata->age);
			}break;
		case 5:fflush(stdin);//清除输入缓冲区
			printf("\n请输入要查找的的关键字:");
			scanf("%s", &key);//输入关键字
			i = Locate(&L, key);//按关键字查找,返回结点序号
			pdata = GetData(&L, i);//按序号查询,返回结点指针
			if (pdata)//若结点指针不为NULL
			{
				printf("第%d个结点为:\nkey=%s\nname=%s\nage=%d\n", i, pdata->key, pdata->name, pdata->age);
			}break;
		case 6:printf("已退出演示!\n"); break;
		default:printf("输入不正确,请重新输入!");
		}
		if (n == 6)
			break;
	}
	return 0;
}

11、效果展示

 

 

 

 

 


感谢观看!码字不易,如果本篇文章对您有帮助,麻烦点赞支持一下!!!感谢^_^!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值