2.4、求顺序表中的最大值和次大值

本文介绍如何在C语言中实现顺序表,包括创建、输入数据、查找最大值和次大值的操作,并提供了Dev-C++6.6和Visual Studio 2019的兼容代码。

2.4、求顺序表中的最大值和次大值

2.5、元素 x 插入递增有序的顺序表

 2.6、合并两个递增顺序表 / 单链表

2.7、求俩递增单链表的交集单链表

Dev-C++ 6.6 安装程序

Visual Studio 2019 安装程序

/************************************************************
* Windows 10下,Dev-C++ 6.6、Visual Studio 2019 中测试通过	*
*															*
* @file		习题2.4.c										*
*															*
* @brief	习题2.4											*
*			编写算法输出已知顺序表 A 中						*
*			数据元素的最大值和次大值。用					*
*			非形式算法描述,并编写C语言程序。				*
*															*
* @author	优快云@洛必不达法则								*
*															*
* @date		2021-10-17										*
*************************************************************/

#define _CRT_SECURE_NO_WARNINGS		// VS2019中 scanf 被认为是不安全的,需要加上该宏才能使用
#include <stdio.h>
#include <stdlib.h>

/**
* @brief	定义顺序表结构体
*/
typedef struct
{
	int* data;		// 存储数据元素的一段内存
	int last;		// 最后一个元素的下标
	int maxsize;	// 最大容量
}SeqList;

/**
* @brief	初始化顺序表
* @param maxsize	顺序表的容量
* @return	初始化成功的顺序表地址
*/
SeqList* InitSeqList(int maxsize)
{
	SeqList* pList = (SeqList*)malloc(sizeof(SeqList));
	if (!pList)
	{
		printf("内存申请失败!\n");
		return NULL;
	}
	pList->data = (int*)malloc(sizeof(int) * maxsize);
	if (!pList->data)
	{
		printf("内存申请失败!\n");
		return NULL;
	}
	pList->maxsize = maxsize;
	pList->last = -1;
	return pList;
}

/**
* @brief	创建顺序表
* @return	创建的顺序表的地址
*/
SeqList* CreateSeqList()
{
	int maxsize = 0;
	int data = 0;
	printf("设置顺序表的容量:");
	scanf("%d", &maxsize);
	SeqList* pList = InitSeqList(maxsize);
	printf("输入顺序表的数据(输入任意字母字符结束):\n");
	while (pList->last < pList->maxsize - 1)
	{
		if (!scanf("%d", &data))
			break;
		pList->data[++pList->last] = data;
	}
	return pList;
}

/**
* @brief	遍历打印顺序表表数据
* @param pList	需要遍历的顺序表
*/
void PrintSeqList(SeqList* pList)
{
	for (int i = 0; i <= pList->last; i++)
	{
		printf("%d  ", pList->data[i]);
	}
	printf("\n");
}

/**
* @brief	获取顺序表中的最大值和次大值,以数组形式返回
* @param pList	待求顺序表
* @return	一个长度为2的整型数组,下标0为最大值,下标1为次大值
*/
int* GetSeqListMaxAndSec(SeqList* pList)
{
	// int max[2]; 在 Dev-C++ 6.6 中测试不通过
	int* max = (int*)malloc(sizeof(int) * 2);

	// 空表,最大值和次大值都取0
	if (pList->last == -1)
	{
		max[0] = 0;
		max[1] = 0;
		return max;
	}
	// 顺序表不为空
	else
	{
		// 最大值和次大值初始值为data[0]
		max[0] = pList->data[0];
		max[1] = pList->data[0];
		// 从data[1]开始比较
		for (int i = 1; i <= pList->last; i++)
		{
			if (pList->data[i] > max[0])
			{
				max[1] = max[0];
				max[0] = pList->data[i];
			}
			else if (pList->data[i] < max[0] && (pList->data[i] > max[1] || max[0] == max[1]))
			{
				max[1] = pList->data[i];
			}
		}
		return max;
	}
}

int main()
{
	printf("\t********* 习题2.4 *********\n");
	SeqList* A = CreateSeqList();

	printf("打印顺序表表:\n");
	PrintSeqList(A);

	int* max2 = GetSeqListMaxAndSec(A);
	printf("\n最大值为:%d,次大值为:%d\n", max2[0], max2[1]);

	return 0;
}

<think>好的,用户让我介绍C语言中的顺序表定义,以及算法2.1到2.4,还要设计一个主函数来调用这些算法。我需要先回忆顺序表的基本结构常用操作。 首先,顺序表的定义通常是用结构体,包含数据数组长度。用户可能指的是静态分配的数组,所以我会用#define定义最大长度,结构体里包含一个ElemType数组一个length变量。 接下来是算法部分。算法2.1到2.4应该是顺序表的基本操作,比如初始化、插入、删除按值查找。需要确认每个算法的参数返回值。例如,初始化可能用Status InitList,返回是否成功。插入删除操作需要位置参数,返回状态码。 然后,主函数的设计需要创建顺序表实例,调用各个函数,测试它们的功能。比如先初始化,然后插入几个元素,再删除某个位置的元素,最后查找元素的位置。需要确保代码示例正确,比如数组索引是否从0或1开始,这里通常顺序表教材中使用的是从1开始的位置,所以插入的位置i需要对应数组的i-1索引。 需要注意用户提到的“代码参考上一节算法2.1~2.4”,可能意味着函数的参数实现方式需要之前的保持一致,比如使用指针传递顺序表,函数返回状态等。另外,用户希望主函数能调用这些算法,所以每个步骤要有输出信息,方便验证结果。 可能容易出错的地方是插入删除时的位置判断,比如i的范围应该是1到L.length+1(插入)或1到L.length(删除)。需要确保这些条件在代码中正确体现。同时,在移动元素时,循环的起始结束条件要正确,避免越界或覆盖错误。 最后,测试主函数时,应该包括正常情况边界情况,比如在表头、表尾插入,删除最后一个元素等。但用户可能只需要一个简单的示例,所以可以插入三个元素,删除中间一个,然后查找是否存在某个值。 总结下来,步骤是:定义结构体,实现四个算法函数,编写主函数按顺序调用输出结果,确保代码语法正确,特别是LaTeX格式的行内公式独立公式部分,不过用户的问题主要是代码,所以这部分可能不需要数学公式,但需要按照用户之前的指令处理其他回答中的数学表达式。</think>以下是用C语言实现顺序表定义及基本算法的详细代码(算法2.1~2.4),包含可运行的主函数测试: ```c #include <stdio.h> #include <stdlib.h> // 用于exit函数 #define MAXSIZE 100 // 顺序表最大长度 #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef int ElemType; typedef int Status; /* 顺序表定义 */ typedef struct { ElemType *elem; // 存储空间的基地址 int length; // 当前长度 } SqList; /* 算法2.1:初始化顺序表 */ Status InitList(SqList *L) { L->elem = (ElemType *)malloc(MAXSIZE * sizeof(ElemType)); if (!L->elem) exit(OVERFLOW); L->length = 0; return OK; } /* 算法2.2:插入元素 */ Status ListInsert(SqList *L, int i, ElemType e) { if (i < 1 || i > L->length + 1) return ERROR; // 校验位置合法性 if (L->length >= MAXSIZE) return ERROR; // 存储空间已满 for (int j = L->length; j >= i; j--) // 元素后移 L->elem[j] = L->elem[j-1]; L->elem[i-1] = e; L->length++; return OK; } /* 算法2.3:删除元素 */ Status ListDelete(SqList *L, int i, ElemType *e) { if (i < 1 || i > L->length) return ERROR; // 校验位置合法性 *e = L->elem[i-1]; // 保存被删除元素 for (int j = i; j < L->length; j++) // 元素前移 L->elem[j-1] = L->elem[j]; L->length--; return OK; } /* 算法2.4:按值查找 */ int LocateElem(SqList L, ElemType e) { for (int i = 0; i < L.length; i++) if (L.elem[i] == e) return i + 1; // 返回逻辑位置(从1开始) return 0; // 未找到返回0 } /* 主函数测试 */ int main() { SqList L; ElemType e; int position; // 初始化测试 if (!InitList(&L)) { printf("初始化失败!"); return -1; } printf("顺序表初始化成功\n"); // 插入测试 ListInsert(&L, 1, 10); // 第1个位置插入10 ListInsert(&L, 2, 20); // 第2个位置插入20 ListInsert(&L, 3, 30); // 第3个位置插入30 printf("插入后的顺序表长度:%d\n", L.length); // 删除测试 ListDelete(&L, 2, &e); printf("删除第2元素:%d,当前长度:%d\n", e, L.length); // 查找测试 position = LocateElem(L, 30); if (position) printf("元素30的位置:%d\n", position); else printf("未找到元素30\n"); // 内存释放 free(L.elem); return 0; } ``` 代码说明: 1. **结构定义**:使用动态内存分配,通过`SqList`结构体包含数据存储区长度信息 2. **核心算法**: - 初始化时分配内存空间(算法2.1) - 插入时进行位置验证元素后移(算法2.2) - 删除时保存元素进行前移(算法2.3) - 查找使用线性搜索(算法2.4) 3. **主函数**: - 演示初始化→插入→删除→查找的完整流程 - 包含错误处理机制 - 最后释放动态分配的内存 运行结果示例: ``` 顺序表初始化成功 插入后的顺序表长度:3 删除第2元素20,当前长度:2 元素30的位置:2 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值