上机实验一 顺序表的基本操作和简单程序 西安石油大学数据结构

news2024/12/29 16:49:25

上机一

实验名称:顺序表的基本操作和简单程序

题目:设计一个有序顺序表,实现以下操作:

1.将元素x插入表中并保持有序;

2.查找值为x的元素,若找到则将其删除;

3.输出表中所有元素。

要求:对上述每个操作各设计为一个子函数,并设计一个主函数调用各子函数,以验证所设计的有序顺序表的正确性。

分析:

题目分析:

这道题要求我们设计一个有序顺序表,然后实现三个基本操作:插入、删除和输出。其中,插入和删除要求保持表的有序性。具体来说,插入是要把新元素按序插入到合适的位置,而删除是要在表中查找到指定元素并删除它。最后,输出操作需要打印所有的元素,以验证表的正确性。

解题思路:

1.定义一个结构体,表示顺序表,包括数据元素、当前长度和最大容量等属性。

2.定义一个初始化函数,用于初始化顺序表。

3.定义一个插入函数,用于将给定元素按序插入到顺序表中。

4.定义一个查找函数,用于查找指定元素在表中的位置,并返回该位置的下标。

5.定义一个删除函数,用于删除指定元素,并保持表的有序性。

6.定义一个输出函数,用于按顺序打印所有元素。

7.在主函数中,创建一个顺序表对象,并依次调用插入、删除和输出等操作函数,以验证其正确性。

伪代码:

1.定义结构体SeqList,表示顺序表
struct SeqList {
int *data; // 数据元素
int length; // 当前长度
int capacity; // 最大容量
};

2.定义初始化函数InitList
void InitList(SeqList &L, int maxsize) {
L.data = new int[maxsize];
L.length = 0;
L.capacity = maxsize;
}

3.定义插入函数Insert
bool Insert(SeqList &L, int x) {
if (L.length == L.capacity) return false; // 表满,插入失败
int i = L.length - 1; // 从后往前查找插入位置
while (i >= 0 && L.data[i] > x) {
L.data[i + 1] = L.data[i];
i–;
}
L.data[i + 1] = x;
L.length++;
return true;
}

4.定义查找函数Find
int Find(SeqList L, int x) {
int i = 0;
while (i < L.length && L.data[i] != x) {
i++;
}
return i < L.length ? i : -1;
}

5.定义删除函数Delete
bool Delete(SeqList &L, int x) {
int pos = Find(L, x);
if (pos == -1) return false; // 找不到指定元素,删除失败
for (int i = pos + 1; i < L.length; i++) {
L.data[i - 1] = L.data[i];
}
L.length–;
return true;
}

6.定义输出函数Print
void Print(SeqList L) {
for (int i = 0; i < L.length; i++) {
cout << L.data[i] << " ";
}
cout << endl;
}

7.在主函数中,依次调用以上定义的函数,以实现测试。

代码示例

这段代码定义了一个有序顺序表的数据结构SqList,并实现了初始化、插入元素、删除元素和输出所有元素等操作。具体来说,代码分为以下几个部分:

首先定义了MAXSIZE常量表示顺序表的最大长度,以及ElemType类型表示顺序表中元素的类型,这里假设为int类型。

#include <stdio.h>
#define MAXSIZE 100

typedef int ElemType;  // 假设表中元素类型为int

typedef struct {
    ElemType data[MAXSIZE];  // 存放表中元素的数组
    int length;              // 当前表长
} SqList;

接着实现了初始化有序顺序表的函数InitList,将length赋值为0。

void InitList(SqList *L) {
    L->length = 0;
}

然后是有序插入元素的函数InsertElement,先判断顺序表是否已满,若已满则返回0表示插入失败;否则在合适的位置插入元素,并将length加1,最终返回1表示插入成功。

int InsertElement(SqList *L, ElemType x) {
    if (L->length == MAXSIZE)  // 表满
        return 0;
    int i, j;
    for (i = 0; i < L->length && L->data[i] < x; i++);
    for (j = L->length - 1; j >= i; j--)
        L->data[j+1] = L->data[j];
    L->data[i] = x;
    L->length++;
    return 1;
}

接下来是删除元素的函数DeleteElement,先判断顺序表是否为空,若为空则返回0表示删除失败;否则在顺序表中查找值为x的元素,若找到则删除并将length减1,最终返回1表示删除成功。

int DeleteElement(SqList *L, ElemType x) {
    if (L->length == 0)  // 空表
        return 0;
    int i, j;
    for (i = 0; i < L->length && L->data[i] < x; i++);
    if (i >= L->length || L->data[i] > x)  // 未找到
        return 0;
    for (j = i; j < L->length - 1; j++)
        L->data[j] = L->data[j+1];
    L->length--;
    return 1;
}

最后是输出所有元素的函数PrintList,遍历顺序表中所有元素,逐个输出,并在最后加上换行符。

void PrintList(SqList L) {
    int i;
    for (i = 0; i < L.length; i++)
        printf("%d ", L.data[i]);
    printf("\n");
}

在主函数中,先初始化一个有序顺序表L,然后插入4个元素,并输出顺序表中所有元素。接着删除元素4并输出,然后尝试删除一个不存在的元素5并输出,最后再次输出顺序表中所有元素。

int main() {
    SqList L;
    InitList(&L);
    InsertElement(&L, 3);
    InsertElement(&L, 1);
    InsertElement(&L, 4);
    InsertElement(&L, 2);
    printf("Insert 3, 1, 4, 2 in order: ");
    PrintList(L);
    DeleteElement(&L, 4);
    printf("Delete 4: ");
    PrintList(L);
    DeleteElement(&L, 5);
    printf("Delete 5: ");
    PrintList(L);
    printf("All elements: ");
    PrintList(L);
    return 0;
}

下面是一个基于顺序表的有序操作的示例程序:

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

// 定义顺序表结构体
typedef struct {
    int *data;      // 存储数据的数组
    int length;     // 顺序表长度
    int capacity;   // 数组最大容量
} ArrayList;

// 初始化顺序表
void init_list(ArrayList *list, int capacity) {
    list->data = (int *) malloc(sizeof(int) * capacity);
    list->length = 0;
    list->capacity = capacity;
}

// 插入元素并保持有序
void insert(ArrayList *list, int x) {
    int i = 0;
    while (i < list->length && list->data[i] < x) {
        i++;
    }

    for (int j = list->length; j > i; j--) {
        list->data[j] = list->data[j - 1];
    }

    list->data[i] = x;
    list->length++;
}

// 查找值为x的元素并删除
void delete(ArrayList *list, int x) {
    int i;
    for (i = 0; i < list->length; i++) {
        if (list->data[i] == x) {
            break;
        }
    }

    if (i == list->length) {
        printf("未找到该元素!\n");
    } else {
        for (int j = i; j < list->length - 1; j++) {
            list->data[j] = list->data[j + 1];
        }
        list->length--;
        printf("删除成功!\n");
    }
}

// 输出表中所有元素
void print_all(ArrayList *list) {
    for (int i = 0; i < list->length; i++) {
        printf("%d ", list->data[i]);
    }
    printf("\n");
}

// 主函数
int main() {
    ArrayList list;
    int capacity, num;

    printf("请输入顺序表的容量:");
    scanf("%d", &capacity);

    init_list(&list, capacity);

    printf("请输入一组有序整数序列(以空格分隔):");
    for (int i = 0; i < capacity; i++) {
        scanf("%d", &num);
        insert(&list, num);
    }

    printf("插入后的有序列表:");
    print_all(&list);

    printf("请输入要删除的元素:");
    scanf("%d", &num);
    delete(&list, num);

    printf("删除后的有序列表:");
    print_all(&list);

    return 0;
}

你可以将以上代码保存为一个.c文件,并编译运行来验证顺序表的正确性。在程序运行过程中,首先输入顺序表的容量,然后输入一组有序整数序列,程序会依次将其插入顺序表中,并输出插入后的列表。然后输入要删除的元素,程序会在顺序表中查找并删除该元素,并输出删除后的列表。

## 示例代码:

#include <stdio.h>
#define MAXSIZE 100

typedef int ElemType;  // 假设表中元素类型为int

typedef struct {
    ElemType data[MAXSIZE];  // 存放表中元素的数组
    int length;              // 当前表长
} SqList;

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

// 在有序顺序表中插入元素并保持有序
int InsertElement(SqList *L, ElemType x) {
    if (L->length == MAXSIZE)  // 表满
        return 0;
    int i, j;
    for (i = 0; i < L->length && L->data[i] < x; i++);
    for (j = L->length - 1; j >= i; j--)
        L->data[j+1] = L->data[j];
    L->data[i] = x;
    L->length++;
    return 1;
}

// 在有序顺序表中查找值为x的元素并删除
int DeleteElement(SqList *L, ElemType x) {
    if (L->length == 0)  // 空表
        return 0;
    int i, j;
    for (i = 0; i < L->length && L->data[i] < x; i++);
    if (i >= L->length || L->data[i] > x)  // 未找到
        return 0;
    for (j = i; j < L->length - 1; j++)
        L->data[j] = L->data[j+1];
    L->length--;
    return 1;
}

// 输出有序顺序表中所有元素
void PrintList(SqList L) {
    int i;
    for (i = 0; i < L.length; i++)
        printf("%d ", L.data[i]);
    printf("\n");
}

// 主函数进行各子函数的测试
int main() {
    SqList L;
    InitList(&L);
    InsertElement(&L, 3);
    InsertElement(&L, 1);
    InsertElement(&L, 4);
    InsertElement(&L, 2);
    printf("Insert 3, 1, 4, 2 in order: ");
    PrintList(L);
    DeleteElement(&L, 4);
    printf("Delete 4: ");
    PrintList(L);
    DeleteElement(&L, 5);
    printf("Delete 5: ");
    PrintList(L);
    printf("All elements: ");
    PrintList(L);
    return 0;
}

在主函数中,测试完删除元素操作后,我添加了一个输出表中所有元素的代码行:printf("All elements: "); PrintList(L);。这样就可以在测试完整个程序后,输出有序顺序表中的所有元素了。

讲解

这段代码定义了一个有序顺序表的数据结构SqList,并实现了初始化、插入元素、删除元素和输出所有元素等操作。具体来说,代码分为以下几个部分:

首先定义了MAXSIZE常量表示顺序表的最大长度,以及ElemType类型表示顺序表中元素的类型,这里假设为int类型。

#include <stdio.h>
#define MAXSIZE 100

typedef int ElemType;  // 假设表中元素类型为int

typedef struct {
    ElemType data[MAXSIZE];  // 存放表中元素的数组
    int length;              // 当前表长
} SqList;

接着实现了初始化有序顺序表的函数InitList,将length赋值为0。

void InitList(SqList *L) {
    L->length = 0;
}

然后是有序插入元素的函数InsertElement,先判断顺序表是否已满,若已满则返回0表示插入失败;否则在合适的位置插入元素,并将length加1,最终返回1表示插入成功。

int InsertElement(SqList *L, ElemType x) {
    if (L->length == MAXSIZE)  // 表满
        return 0;
    int i, j;
    for (i = 0; i < L->length && L->data[i] < x; i++);
    for (j = L->length - 1; j >= i; j--)
        L->data[j+1] = L->data[j];
    L->data[i] = x;
    L->length++;
    return 1;
}

接下来是删除元素的函数DeleteElement,先判断顺序表是否为空,若为空则返回0表示删除失败;否则在顺序表中查找值为x的元素,若找到则删除并将length减1,最终返回1表示删除成功。

int DeleteElement(SqList *L, ElemType x) {
    if (L->length == 0)  // 空表
        return 0;
    int i, j;
    for (i = 0; i < L->length && L->data[i] < x; i++);
    if (i >= L->length || L->data[i] > x)  // 未找到
        return 0;
    for (j = i; j < L->length - 1; j++)
        L->data[j] = L->data[j+1];
    L->length--;
    return 1;
}

最后是输出所有元素的函数PrintList,遍历顺序表中所有元素,逐个输出,并在最后加上换行符。

void PrintList(SqList L) {
    int i;
    for (i = 0; i < L.length; i++)
        printf("%d ", L.data[i]);
    printf("\n");
}

在主函数中,先初始化一个有序顺序表L,然后插入4个元素,并输出顺序表中所有元素。接着删除元素4并输出,然后尝试删除一个不存在的元素5并输出,最后再次输出顺序表中所有元素。

int main() {
    SqList L;
    InitList(&L);
    InsertElement(&L, 3);
    InsertElement(&L, 1);
    InsertElement(&L, 4);
    InsertElement(&L, 2);
    printf("Insert 3, 1, 4, 2 in order: ");
    PrintList(L);
    DeleteElement(&L, 4);
    printf("Delete 4: ");
    PrintList(L);
    DeleteElement(&L, 5);
    printf("Delete 5: ");
    PrintList(L);
    printf("All elements: ");
    PrintList(L);
    return 0;
}

详细分析每个函数的实现

  1. 初始化函数 InitList(SeqList &L, int maxsize)

    • 参数:L为要初始化的顺序表对象,maxsize为最大容量
    • 功能:通过动态内存分配为顺序表分配一定大小的数组,并将长度和容量初始化为0和maxsize,实现了顺序表的初始化操作。
  2. 插入函数 Insert(SeqList &L, int x)

    • 参数:L为目标顺序表对象,x为要插入的元素
    • 返回值:布尔类型,表示插入是否成功
    • 功能:将元素x按照从小到大的顺序插入到顺序表中。首先判断顺序表是否已满,若已满则插入失败;若未满,则从后往前遍历顺序表,找到合适的插入位置,并将比x大的元素向后移动一位,最后将x插入到空出来的位置。
  3. 查找函数 Find(SeqList L, int x)

    • 参数:L为目标顺序表对象,x为要查找的元素
    • 返回值:整型,表示元素在表中的位置下标,若找不到则返回-1
    • 功能:在顺序表中查找指定元素x的位置。从表头开始遍历,逐个比较元素的值,直到找到与x相等的元素或遍历到表尾。若找到则返回其位置下标,否则返回-1。
  4. 删除函数 Delete(SeqList &L, int x)

    • 参数:L为目标顺序表对象,x为要删除的元素
    • 返回值:布尔类型,表示删除是否成功
    • 功能:在顺序表中查找指定元素x,若找到则删除该元素并保持有序性。首先调用查找函数找到元素x的位置,若找不到则删除失败;若找到,则将该位置后面的元素依次向前移动一位,最后将长度减1,实现了删除操作。
  5. 输出函数 Print(SeqList L)

    • 参数:L为目标顺序表对象
    • 功能:按照顺序打印出顺序表中所有的元素。使用循环遍历顺序表中的元素,并逐个输出,以空格分隔。

在主函数中,我们创建了一个顺序表对象L,并调用了上述定义的函数进行插入、删除和输出操作,以验证函数的正确性。首先使用插入函数将一些元素按序插入到顺序表中,然后使用输出函数打印出插入元素后的有序表。接着使用删除函数删除指定元素,并再次使用输出函数打印出删除元素后的有序表。最终,程序执行完毕。

这样,我们就实现了一个有序顺序表,并通过插入、删除和输出操作验证了其正确性。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当面试被问到jvm(Java虚拟机)时,如何将面试官引入自己的节奏?

本文目录 前言快问快答抛砖引玉锦上添花好书推荐总结 前言 作为一名Java开发工程师&#xff0c;不管是校招还是社招jvm一定是必问必会的知识点。虽然说真正开发中用到的不多&#xff0c;甚至可以说用不到&#xff08;对于刚入行或者Java初级&#xff09;&#xff0c;但是当面试…

mathtype试用期后如何继续使用?

MathType7已经正式发布&#xff0c;作为一款强大的数学公式编辑器可以将编辑好的公式保存成多种图片格式或透明图片模式&#xff0c;可以很方便的添加或移除符号、表达式等模板&#xff08;只需要简单地用鼠标拖进拖出即可)&#xff0c;也可以很方便地修改模板&#xff0c;为理…

AdaBoost算法解密:从基础到应用的全面解析

目录 一、简介什么是AdaBoostAdaBoost的历史和重要性定义 二、基础概念集成学习&#xff08;Ensemble Learning&#xff09;定义示例 弱学习器和强学习器定义示例 三、AdaBoost算法原理样本权重&#xff08;Sample Weights&#xff09;定义示例 学习器权重&#xff08;Learner …

大麦订单截图生成 大麦一键生成订单截图

新版大麦订单生成 图样式展示 这个样式图就是在大麦生成完的一个订单截图&#xff0c;它的状态是等待卖家发货 后台一键生成&#xff0c;独立后台管理 教程&#xff1a;修改conf数据库账号密码 不会的可以看源码里有搭建教程 下载程序&#xff1a;https://pan.baidu.com/…

python自动解析301、302重定向链接

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 使用模块requests 方式代码如下&#xff1a; import requests url_string"http://******" r requests.head(url_string, streamTrue) print r.h…

测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)

文章目录 一、任务描述二、指标分析2.1 TP/FP/FN/TN2.2 精准率2.3 召回率 三、接口处理四、数据集处理五、开始计算指标五、实用工具5.1 移动文件5.2 可视化JSON标签5.3 可视化TXT标签 一、任务描述 通过给定的算法接口&#xff0c;对算法的输出&#xff08;置信度、检测框、告…

【教学类-38-02】20230724京剧脸谱2.0——竖版(小彩图 大面具)(Python 彩图彩照转素描线描稿)

结果展示 背景需求&#xff1a; 前文体运用Python颜色提取功能&#xff0c;将“京剧脸谱”彩色图片转化为线描图案。 【教学类-38】20230724京剧脸谱1.0——横版“彩图线图等大”&#xff08;Python 彩图彩照转素描线描稿&#xff09;_reasonsummer的博客-CSDN博客 存在问题&…

大语言模型之十二 SentencePiece扩充LLama2中文词汇

大语言模型的发展潜力已经毋庸置疑了&#xff0c;如何让中文大语言模型更适合中小公司使用这是一道难题。在模型的选择上我们倾向于选择国外的LLama或者BLoom之类的&#xff0c;而不是百川之类的中文大模型&#xff0c;原因在于从基建到框架到数据国外的开源资料非常多&#xf…

背诵不等于理解,深度解析大模型背后的知识储存与提取

自然语言模型的背诵 (memorization) 并不等于理解。即使模型能完整记住所有数据&#xff0c;也可能无法通过微调 (finetune) 提取这些知识&#xff0c;无法回答简单的问题。 随着模型规模的增大&#xff0c;人们开始探索大模型是如何掌握大量知识的。一种观点认为这归功于 “无…

国庆共68条评论《乡村振兴战略下传统村落文化旅游旅游设计》许少辉八一新书

国庆共68条评论《乡村振兴战略下传统村落文化旅游旅游设计》许少辉八一新书 国庆共68条评论《乡村振兴战略下传统村落文化旅游旅游设计》许少辉八一新书

【STM32】IAP升级03关闭总中断,检测栈顶指针

IAP升级方法 IAP升级时需要关闭总中断 TM32在使用时有时需要禁用全局中断&#xff0c;比如MCU在升级过程中需禁用外部中断&#xff0c;防止升级过程中外部中断触发导致升级失败。 ARM MDK中提供了如下两个接口来禁用和开启总中断&#xff1a; __disable_irq(); // 关闭总中…

函数指针详解和简单使用

概念 函数指针&#xff1a;首先它是一个指针&#xff0c;一个指向函数的指针&#xff0c;在内存空间中存放的是函数的地址&#xff1b; 引入 #include <stdio.h>void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf(&quo…

基于 SpringBoot+Vue 的大学生租房网站

1 简介 本大学生租房系统使用简洁的框架结构&#xff0c;专门用于用户浏览首页&#xff0c;房屋信息&#xff0c;房屋评价&#xff0c;公告资讯&#xff0c;个人中心&#xff0c;后台管理&#xff0c;意见反馈等信息&#xff0c;对个人信息进行修改等&#xff0c;以及系统管理…

基于Java的大学生就业招聘系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Java基础---第十篇

系列文章目录 文章目录 系列文章目录一、说说Java 中 IO 流二、 Java IO与 NIO的区别(补充)三、java反射的作用于原理一、说说Java 中 IO 流 Java 中 IO 流分为几种? 按照流的流向分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照流的角色…

【笔试强训day02】倒置字符串 排序子序列

​&#x1f47b;内容专栏&#xff1a; 笔试强训集锦 &#x1f428;本文概括&#xff1a;C笔试强训day02。 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.10.1 二、day02 1.倒置字符串 题目描述&#xff1a; 将一句话的单词进行倒置&…

工厂模式和单例模式

目录 一.设计模式 二.工厂模式和单例模式 &#x1f41e;单例模式 1.饿汉模式 2.懒汉模式 &#xff08;1&#xff09;问题一&#xff1a;大量对象的创建 &#xff08;2&#xff09;问题二&#xff1a;加锁导致阻塞等待 &#xff08;3&#xff09;问题三&#xff1a;指令…

MySql进阶篇---006:存储引擎,索引,SQL优化,视图、存储过程、变量、流程控制、游标、存储函数、触发器

1. 存储引擎 1.1 MySQL体系结构 1).连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff0c;为通过认证…

【面试经典150 | 矩阵】螺旋矩阵

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;模拟方法二&#xff1a;按层模拟 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于…

04. Springboot集成Mybatis-flex(二)

1、前言 上一篇文章《Springboot集成Mybatis-flex&#xff08;一&#xff09;》提到Mybatis Flex和Spring Boot的初步集成和基础使用。今天我们再来探索Mybatis Flex其他特性的使用。 2、数据填充 数据填充指的是&#xff0c;当 Entity 数据被插入 或者 更新的时候&#xff…