06 – 线性表 – 顺序表 – 综合题

题目1

从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

本题算法代码如下(类C语言):

bool Del_Min(SqList &L,ElemType &value)
{
	// 删除顺序表L中最小值最小值元素结点,并通过引用型参数value返回其值
	// 若删除成功,则返回true,否则返回false
	if (L.length == 0)
	{
		return false;
	}
	value = L.data[0];
	int pos = 0;
	for (int i = 1; i < L.length;i++)
	{
		if (L.data[i] < value)
		{
			value = L.data[i];
			pos = i;
		}
	}
	L.data[pos] = L.data[L.length - 1];
	L.length--;
	return true;
}

代码(C语言):

#include <stdbool.h>

// 删除顺序表L中的最小元素,通过value返回其值(引用传递)
// 成功删除返回true,表空时返回false
bool Del_Min(SqList* L, ElemType* value) {  // 更符合C语言习惯的指针传递
    if (L->length == 0) return false;       // 空表直接返回失败
    
    // 初始化最小值为第一个元素
    ElemType min_val = L->data[0];
    int min_pos = 0;
    
    // 遍历查找最小值及其位置
    for (int i = 1; i < L->length; i++) {
        if (L->data[i] < min_val) {
            min_val = L->data[i];
            min_pos = i;
        }
    }
    
    // 用最后一个元素覆盖最小值位置,缩短表长
    L->data[min_pos] = L->data[L->length - 1];
    L->length--;
    
    *value = min_val;  // 通过指针回传最小值
    return true;
}

优化内容:

主要优化说明:

  1. 将引用参数&value改为更符合 C 语言习惯的指针ElemType* value(原代码可能使用 C++ 引用,这里调整为 C 兼容写法)
  2. 变量重命名:posmin_posvaluemin_val(更清晰表示变量含义)
  3. 注释精简:保留核心逻辑说明,去除冗余描述
  4. 代码结构优化:合并部分语句(如空表判断直接返回),减少不必要的临时变量
  5. 参数调整:将SqList &L改为SqList* L(更符合 C 语言对结构体的操作习惯)

注:若需要严格保持 C++ 引用语法(原代码的&),可将参数改回SqList &L, ElemType &value,其他逻辑无需改动。

代码测试:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100  // 顺序表最大容量
typedef int ElemType;  // 假设元素类型为int

// 顺序表结构体定义
typedef struct {
    ElemType data[MAX_SIZE];
    int length;         // 当前长度
} SqList;

// 删除顺序表L中的最小元素,通过value返回其值(指针传递)
// 成功删除返回true,表空时返回false
bool Del_Min(SqList* L, ElemType* value) {
    if (L->length == 0) return false;  // 空表直接返回失败
    
    ElemType min_val = L->data[0];  // 记录最小值
    int min_pos = 0;                // 记录最小值位置
    
    // 遍历查找最小值
    for (int i = 1; i < L->length; i++) {
        if (L->data[i] < min_val) {
            min_val = L->data[i];
            min_pos = i;
        }
    }
    
    // 用最后一个元素覆盖最小值位置,缩短表长
    L->data[min_pos] = L->data[L->length - 1];
    L->length--;
    
    *value = min_val;  // 通过指针回传最小值
    return true;
}

// 测试函数
void test_Del_Min() {
    SqList list;
    ElemType min_val;
    bool ret;

    // 测试1:空表
    list.length = 0;
    ret = Del_Min(&list, &min_val);
    printf("测试1(空表): %s,预期false\n", ret ? "失败" : "成功");

    // 测试2:单个元素
    list.length = 1;
    list.data[0] = 5;
    ret = Del_Min(&list, &min_val);
    printf("测试2(单个元素): %s,返回值=%d,剩余长度=%d(预期成功/5/0)\n",
           ret ? "成功" : "失败", min_val, list.length);

    // 测试3:多个元素(最小值在中间)
    list.length = 5;
    int test_data[] = {3, 1, 4, 1, 5};  // 初始数据
    for (int i = 0; i < list.length; i++) list.data[i] = test_data[i];
    ret = Del_Min(&list, &min_val);
    printf("测试3(多元素): %s,返回值=%d,剩余数据=[",
           ret ? "成功" : "失败", min_val);
    for (int i = 0; i < list.length; i++) printf("%d ", list.data[i]);
    printf("](预期成功/1,剩余[3,5,4,1])\n");  // 注意:最后一个元素覆盖到删除位置
}

int main() {
    test_Del_Min();
    return 0;
}
    

运行结果:

06 - 线性表 - 顺序表 - 综合题

知识点补充:

1、本题也可以用函数返回值返回;两者的区别是:函数返回值只能返回一个值,而参数返回(引用参数)可以返回多个值。

2、&和*的区别

运算符含义常见使用场景关键作用
&取地址运算符函数调用时传递变量的地址让函数能访问 / 修改原始变量
*指针声明符 / 解引用运算符函数参数声明指针类型;访问指针指向的值声明指针变量;通过地址操作原变量

3、比较最小值的代码实现

#include <stdio.h>

int main() {
    int arr[] = { 4, 2, 3, 4, 5 };  
    int sz = sizeof(arr) / sizeof(arr[0]);
    int min = arr[0];  // 初始化为第一个元素

    for (int i = 1; i < sz; i++) {
        if (arr[i] < min) {
            min = arr[i];  // 更新最小值
        }
    }

    printf("输出最小值 = %d", min);
    return 0;
}
06 - 线性表 - 顺序表 - 综合题

题目2

设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)

本题算法代码如下(类C语言):

void Reverse(SqList& L)
{
	ElemType temp;
	for (int i = 0; i < L.length / 2; i++)
	{
		temp = L.data[i];
		L.data[i] = L.length - i - 1;
		L.data[L.length - i - 1] = temp;
	}
}

代码(C语言):

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

// 顺序表结构体定义
typedef struct {
    int *data;   // 存储数据的数组
    int length;  // 当前长度
    int max_size;// 最大容量(可选,根据需求添加)
} SqList;

// 初始化顺序表(动态分配内存)
void initSqList(SqList *L, int max_size) {
    L->data = (int *)malloc(max_size * sizeof(int));
    if (!L->data) {
        printf("内存分配失败!\n");
        exit(1);
    }
    L->length = 0;
    L->max_size = max_size;
}

// 逆置顺序表(核心算法)
void reverseSqList(SqList *L) {
    int i = 0;
    int j = L->length - 1;
    int temp;
    while (i < j) {
        // 交换data[i]和data[j]
        temp = L->data[i];
        L->data[i] = L->data[j];
        L->data[j] = temp;
        i++;
        j--;
    }
}

// 测试函数
int main() {
    // 初始化一个最大容量为10的顺序表
    SqList L;
    initSqList(&L, 10);

    // 填充测试数据(长度为5)
    L.data[0] = 1;
    L.data[1] = 2;
    L.data[2] = 3;
    L.data[3] = 4;
    L.data[4] = 5;
    L.length = 5;

    printf("逆置前顺序表: ");
    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
    printf("\n");

    // 逆置操作
    reverseSqList(&L);

    printf("逆置后顺序表: ");
    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
    printf("\n");

    // 释放内存
    free(L.data);
    return 0;
}
    

运行结果:

06 - 线性表 - 顺序表 - 综合题

算法思路

  1. 定义两个指针i(初始为 0,指向头部)和j(初始为length-1,指向尾部)。
  2. i < j时,交换L->data[i]L->data[j]
  3. i右移(i++),j左移(j--),直到i >= j时结束。

本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客

(0)
何大锤的头像何大锤管理团队

相关推荐

  • C语言初阶 – 指针

    一、指针是什么? 指针是什么? 指针理解的2个要点: 1、指针是内存中一个最小单元(内存单元)的编号,也就是地址 2、平时口语中说的指针,通常是指针变量,用来存放内存地址的变量 总结:指针就是地址,口语中说的指针通常指的是指针变量 那么我们就这样理解:内存 指针变量 我们可以通过&(取地址操作符)取出变量的内存地址,把地址可以存放到一个变量中,这个变…

    2025年6月29日
    000
  • 09 通讯录管理系统

    通讯录管理系统 1、系统需求 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C++来实现一个通讯录管理系统 系统中需要实现的功能如下: 2、创建项目 创建项目步骤如下: 2.1 创建项目 打开vs2017后,点击创建新项目,创建新的C++项目 填写项目名称,选择项目路径 2.2添加文件 添加成功后,效果如图: 至此,项目已创建完毕 3、菜单功能 …

    2025年6月22日
    300
  • 08 结构体

    8 结构体 8.1 结构体基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 8.2 结构体定义和使用 语法:struct 结构体名 { 结构体成员列表 }; 通过结构体创建变量的方式有三种: 示例: 总结1:定义结构体时的关键字是struct,不可省略 总结2:创建结构体变量时,关键字struct可以省略 总结3:结构体变量利用操作符 &…

    2025年6月21日
    300
  • 07 指针

    7.1 指针的基本概念 指针的作用: 可以通过指针间接访问内存 7.2 指针变量的定义和使用 指针变量定义语法: 数据类型 * 变量名; 示例: 指针变量和普通变量的区别 总结1: 我们可以通过 & 符号 获取变量的地址 总结2:利用指针可以记录地址 总结3:对指针变量解引用,可以操作指针指向的内存 7.3 指针所占内存空间 提问:指针也是种数据类型…

    2025年6月20日
    300
  • 第2章 C语言概述

    一、复习题 1、C语言的基本模块是什么? 它们都叫函数 2、什么是语法错误?写一个英语例子和C语言例子 3、什么是语义错误?写一个英语例子和C语言例子 4、Indiana Sloth编写了下面的程序,并征求你的意见。请帮助他评定 第一行没有加<> 赋值语句错误 函数错误应该是printf 花括号不齐全 二、编程练习 2.1 2.2 2.3 编写一…

    2025年6月20日
    000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

2211932694

在线咨询: QQ交谈

邮件:hdcblog1999@163.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
网站建设中ing......