数据结构一:顺序表(C/C++实现)

目录

代码实现(C):

代码实现(C++):

结果展示:

总结:


顺序表是线性表的一种

分为静态顺序表和动态顺序表

代码实现(C):

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE	20
typedef int ElemType;
typedef struct {		//静态顺序表
	ElemType data[MAXSIZE];
	int lenth;
}SqList;


//初始化静态顺序表,长度不可变
void InitSqList(SqList* L)
{
    L->lenth = 6;//设定初始顺序表有6个数据
	for (int i = 0; i < L->lenth; i++) {
		L->data[i] = i + 1;
	}
}
//输出顺序表
void PrintList(SqList L)
{
	for (int i = 0; i < L.lenth; i++) {
		printf("data[%d]:%d     ", i, L.data[i]);
	}
	printf("\n");
}
//顺序表第i个位置插入元素e
int SqListInsert(SqList* L, int i, ElemType e)
{
	if (i < 1 || i > L->lenth + 1)	return 0;	//超出范围不能插入
	if (L->lenth >= MAXSIZE)	return 0;	//表满不能插入
	for (int j = L->lenth; j >= i; j--) {
		L->data[j] = L->data[j - 1];	//第i个位置之后的元素后移
	}
	L->data[i - 1] = e;
	L->lenth++;
	return 1;
}
//删除第i个元素,并返回删除的元素e
int SqListDelete(SqList* L, int i, ElemType* e)
{
	if (i < 1 || i > L->lenth)	return 0;	//超出范围不能删除
	if (L->lenth == 0)	return 0;	//表空不能删除
	*e = L->data[i - 1];
	for (int j = i; j < L->lenth; j++) {
		L->data[j - 1] = L->data[j];//第i个位置之后的元素前移
	}
	L->lenth--;
	return 1;
}
//按值查找元素,并返回位序
int SqListLocateItem(SqList L, ElemType e)
{
	for (int i = 0; i < L.lenth; i++) {
		if (L.data[i] == e)
			return i + 1;
	}
	return -1;	//查找失败
}

int main()
{
	SqList L1, L2;
	int e, temp;

	/*******************************插入、删除、查找成功***************************/
	printf("插入、删除、查找成功测试:\n");
	InitSqList(&L1);
	printf("初始化顺序表成功!原顺序表为:\n");
	PrintList(L1);
	if (SqListInsert(&L1, 3, 100)) {//第3个位置插入100
		printf("在第3个位置插入100成功!新顺序表为:\n");
		PrintList(L1);
	}
	else {
		printf("在第3个位置插入100失败!\n");
	}

	if (SqListDelete(&L1, 5, &e)) {//删除第5个位置的数据,并输出删除数据
		printf("删除第5个位置的元素成功!删除的元素为:%d,新顺序表为:\n",e);
		PrintList(L1);
	}
	else {
		printf("删除第5个位置的元素失败!\n");
	}
	
	temp = SqListLocateItem(L1, 6);
	if (temp != -1) {//查找6,并返回位序
		printf("查找元素“6”成功!位序为:%d\n", temp);
	}
	else {
		printf("查找失败!\n");
	}
	/****************************************************************************/

	/*******************************插入、删除、查找失败***************************/
	printf("\n插入、删除、查找失败测试:\n");
	InitSqList(&L2);
	printf("初始化顺序表成功!原顺序表为:\n");
	PrintList(L2);
	if (SqListInsert(&L2, 9, 999)) {//第9个位置插入999
		printf("在第9个位置插入999成功!新顺序表为:\n");
		PrintList(L2);
	}
	else {
		printf("在第9个位置插入999失败!\n");
	}

	if (SqListDelete(&L2, 8, &e)) {//删除第8个位置的数据,并输出删除数据
		printf("删除第8个位置的元素成功!删除的元素为:%d,新顺序表为:\n", e);
		PrintList(L2);
	}
	else {
		printf("删除第8个位置的元素失败!\n");
	}

	temp = SqListLocateItem(L2, 123);
	if (temp != -1) {//查找123,并返回位序
		printf("查找元素“123”成功!位序为:%d", temp);
	}
	else {
		printf("查找元素“123”失败!\n");
	}
	/****************************************************************************/

	system("pause");
	return 0;
}

/*
typedef struct {		//动态顺序表
	ElemType* data;
	int lenth;
	int data_maxsize;
}D_SqList;
//初始化动态顺序表,长度可变
int InitDynamicSqList(D_SqList* L)
{
    L->data_maxsize = 20;	//设定表长为20
	L->data = (ElemType*)malloc(sizeof(ElemType) * L->data_maxsize);	//分配内存空间
	if (L->data == NULL)	return 0;
	
	for (int i = 0; i < 6; i++) {
		L->data[i] = i + 1;	//设定初始顺序表有6个数据
		L->lenth++;
	}
	return 1;
}
int IncreaseSize(D_SqList* L, int len)	//增加动态顺序表长度
{
	ElemType* p = L->data;	//保存原数据指针
	L->data = (ElemType*)malloc(sizeof(ElemType) * (L->data_maxsize + len));//新的内存数据空间
	if (L->data == NULL)	return 0;

	for (int i = 0; i < L->lenth; i++) {
		L->data[i] = p[i];	//复制原数据
	}
	L->data_maxsize = L->data_maxsize + len;	//增加表长
	free(p);	//释放原数据空间
	p = NULL;

	return 1;
}
//动态顺序表与静态顺序表只有内存分配上的区别,增删查改操作基本一致
*/

代码实现(C++):

#include <iostream>

#define MAXSIZE	20
typedef int ElemType;
typedef struct {		//静态顺序表
	ElemType data[MAXSIZE];
	int lenth;
}SqList;

//初始化静态顺序表,长度不可变
void InitSqList(SqList& L)
{
	L.lenth = 6; //设定初始顺序表有6个数据
	for (int i = 0; i < L.lenth; i++) {
		L.data[i] = i + 1;
	}
}
//输出顺序表
void PrintList(SqList L)
{
	for (int i = 0; i < L.lenth; i++) {
		std::cout << "data[" << i << "]:" << L.data[i] << "     ";
	}
	std::cout << std::endl;
}
//顺序表第i个位置插入元素e
bool SqListInsert(SqList& L, int i, ElemType e)
{
	if (i < 1 || i > L.lenth + 1)	return false;	//超出范围不能插入
	if (L.lenth >= MAXSIZE)	return false;	//表满不能插入
	for (int j = L.lenth; j >= i; j--) {
		L.data[j] = L.data[j - 1];	//第i个位置之后的元素后移
	}
	L.data[i - 1] = e;
	L.lenth++;
	return true;
}
//删除第i个元素,并返回删除的元素e
bool SqListDelete(SqList& L, int i, ElemType& e)
{
	if (i < 1 || i > L.lenth)	return false;	//超出范围不能删除
	if (L.lenth == 0)	return false;	//表空不能删除
	e = L.data[i - 1];
	for (int j = i; j < L.lenth; j++) {
		L.data[j - 1] = L.data[j];//第i个位置之后的元素前移
	}
	L.lenth--;
	return true;
}
//按值查找元素,并返回位序
int SqListLocateItem(SqList L, ElemType e)
{
	for (int i = 0; i < L.lenth; i++) {
		if (L.data[i] == e)
			return i + 1;
	}
	return -1;	//查找失败
}

int main()
{
	SqList L1, L2;
	int e, temp;

	/*******************************插入、删除、查找成功***************************/
	printf("插入、删除、查找成功测试:\n");
	InitSqList(L1);
	printf("初始化顺序表成功!原顺序表为:\n");
	PrintList(L1);
	if (SqListInsert(L1, 3, 100)) {//第3个位置插入100
		printf("在第3个位置插入100成功!新顺序表为:\n");
		PrintList(L1);
	}
	else {
		printf("在第3个位置插入100失败!\n");
	}

	if (SqListDelete(L1, 5, e)) {//删除第5个位置的数据,并输出删除数据
		printf("删除第5个位置的元素成功!删除的元素为:%d,新顺序表为:\n",e);
		PrintList(L1);
	}
	else {
		printf("删除第5个位置的元素失败!\n");
	}
	
	temp = SqListLocateItem(L1, 6);
	if (temp != -1) {//查找6,并返回位序
		printf("查找元素“6”成功!位序为:%d\n", temp);
	}
	else {
		printf("查找失败!\n");
	}
	/****************************************************************************/

	/*******************************插入、删除、查找失败***************************/
	printf("\n插入、删除、查找失败测试:\n");
	InitSqList(L2);
	printf("初始化顺序表成功!原顺序表为:\n");
	PrintList(L2);
	if (SqListInsert(L2, 9, 999)) {//第9个位置插入999
		printf("在第9个位置插入999成功!新顺序表为:\n");
		PrintList(L2);
	}
	else {
		printf("在第9个位置插入999失败!\n");
	}

	if (SqListDelete(L2, 8, e)) {//删除第8个位置的数据,并输出删除数据
		printf("删除第8个位置的元素成功!删除的元素为:%d,新顺序表为:\n", e);
		PrintList(L2);
	}
	else {
		printf("删除第8个位置的元素失败!\n");
	}

	temp = SqListLocateItem(L2, 123);
	if (temp != -1) {//查找123,并返回位序
		printf("查找元素“123”成功!位序为:%d", temp);
	}
	else {
		printf("查找元素“123”失败!\n");
	}
	/****************************************************************************/

	system("pause");
	return 0;
}

/*
typedef struct {		//动态顺序表
	ElemType* data;
	int lenth;
	int data_maxsize;
}D_SqList;
//初始化动态顺序表,长度可变
bool InitDynamicSqList(D_SqList& L)
{
	L.data_maxsize = 20;	//设定表长为20
	L.data = (ElemType*)malloc(sizeof(ElemType) * L.data_maxsize);	//分配内存空间
	if (L.data == NULL)	return false;

	for (int i = 0; i < 6; i++) {
		L.data[i] = i + 1;	//设定初始顺序表有6个数据
		L.lenth++;
	}
	return true;
}
bool IncreaseSize(D_SqList& L, int len)	//增加动态顺序表长度
{
	ElemType* p = L.data;	//保存原数据指针
	L.data = (ElemType*)malloc(sizeof(ElemType) * (L.data_maxsize + len));//新的内存数据空间
	if (L.data == NULL)	return 0;

	for (int i = 0; i < L.lenth; i++) {
		L.data[i] = p[i];	//复制原数据
	}
	L.data_maxsize = L.data_maxsize + len;	//增加表长
	free(p);	//释放原数据空间
	p = NULL;

	return true;
}
//动态顺序表与静态顺序表只有内存分配上的区别,增删查改操作基本一致
*/

结果展示:

总结:

总体来说C++的引用与布尔值更好操作一些,特别是在后面链表修改指针的时候,引用更方便,也更安全;但是C的指针也不赖,在链表修改指针的时也可以使用二级指针来操作。

以上

以上均为个人学习心得,如有错误,请不吝赐教~

THE END

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
顺序表是一种常见的数据结构,用于存储一组具有相同类型的元素。它的基本操作包括创建、查找、插入和删除等。 在C语言中,可以通过使用数组来实现顺序表。我们可以定义一个数组来存储顺序表的元素,然后通过索引来访问和操作其中的元素。引用中的代码展示了一个简单的顺序表的例子,它使用了C语言实现。在这个例子中,我们可以看到如何创建一个顺序表插入元素、删除元素以及查找元素的前驱和后继。 引用中的代码是一个测试顺序表基本操作的例子。它使用了一个自定义的List类来实现顺序表,并对其进行了各种操作,包括插入元素、删除元素、查找元素的前驱和后继以及遍历整个顺序表顺序表的结构体定义可以根据具体的需求进行定义。在引用中的代码中,定义了一个结构体ConnTimeout,其中包含了一个int类型的fd和一个time_t类型的timeout成员变量。这个结构体可以用来表示连接超时的信息。 总而言之,顺序表是一种常见的数据结构,可以通过使用数组来实现。在C语言中,可以使用数组和相关的操作来创建、查找、插入和删除顺序表中的元素。结构体的定义可以根据具体的需求进行自定义。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [数据结构顺序表c++代码](https://download.csdn.net/download/qq_46546083/13458006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C++数据结构顺序表(模板类实现)](https://blog.csdn.net/sagjhdj/article/details/123260460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【数据结构顺序表(C++)](https://blog.csdn.net/qq_51604330/article/details/120600041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值