数据结构实验报告-顺序表

news2024/9/29 23:26:21

     

一、实验名称

实验1 顺序表

二、实验内容:

1.将书中介绍的顺序表的基本算法(如初始化、求长度、插人、删除、输出等)汇总在一起,用一个完整的程序实现顺序表的基本运算,并且编写顺序表的判空、判满等基本运算的算法。

源码:
#include<stdio.h>

#include<malloc.h>

#define ERROR 0

#define OK 1

 

#define INIT_SIZE 5     /*初始分配的顺序表长度*/

#define INCREM 5        /*溢出时,顺序表长度的增量*/

 

typedef  int ElemType;  /*定义表元素的类型*/

 

typedef struct Sqlist{

       ElemType *slist;      /*存储空间的基地址*/

       int length;           /*顺序表的当前长度*/

       int listsize;         /*当前分配的存储空间*/

}Sqlist;

 

int InitList_sq(Sqlist *L);   /*初始化一个长度为5的顺序表L*/

int CreateList_sq(Sqlist *L,int n);   /*创建一个长度为n的顺序表L*/

int ListInsert_sq(Sqlist *L,int i,ElemType e);   /*在顺序表L中插入数据元素:在第i个元素之前插入e*/

int PrintList_sq(Sqlist *L);   /*输出顺序表的元素*/

int ListDelete_sq(Sqlist *L,int i);   /*删除第i个元素*/

int ListLocate(Sqlist *L,ElemType e);   /*查找值为e的元素*/

 

int InitList_sq(Sqlist *L){

    L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));

    if(!L->slist) return ERROR;

    L->length=0;

    L->listsize=INIT_SIZE;

    return OK;

}/*InitList*/

 

int CreateList_sq(Sqlist *L,int n){

    ElemType e;

    int i;

    for(i=0;i<n;i++){

        printf("input data %d",i+1);

        scanf("%d",&e);

        if(!ListInsert_sq(L,i+1,e))

            return ERROR;

    }

    return OK;

}/*CreateList*/

 

/*输出顺序表中的元素*/

int PrintList_sq(Sqlist *L){

    int i;

    for(i=1;i<=L->length;i++)

        printf("%5d",L->slist[i-1]);

    return OK;

}/*PrintList*/

 

int ListInsert_sq(Sqlist *L,int i,ElemType e){

    int k;

if(i<1||i>L->length+1)

return ERROR;

if(L->length>=L->listsize){

L->slist=(ElemType*)realloc(L->slist,

(INIT_SIZE+INCREM)*sizeof(ElemType));

        if(!L->slist)

return ERROR;

L->listsize+=INCREM;

}

    for(k=L->length-1;k>=i-1;k--){

        L->slist[k+1]= L->slist[k];

    }

    L->slist[i-1]=e;

    L->length++;

    return OK;

}/*ListInsert*/

 

/*在顺序表中删除第i个元素*/

int ListDelete_sq(Sqlist *L,int i){

 

}

/*在顺序表中查找指定值元素,返回其序号*/

int ListLocate(Sqlist *L,ElemType e){

 

}

 

int main(){

    Sqlist sl;

    int n,m,k;

    printf("please input n:");  /*输入顺序表的元素个数*/

    scanf("%d",&n);

    if(n>0){

        printf("\n1-Create Sqlist:\n");

        InitList_sq(&sl);

        CreateList_sq(&sl,n);

        printf("\n2-Print Sqlist:\n");

        PrintList_sq(&sl);

        printf("\nplease input insert location and data:(location,data)\n");

           scanf("%d,%d",&m,&k);

           ListInsert_sq(&sl,m,k);

           printf("\n3-Print Sqlist:\n");

           PrintList_sq(&sl);

           printf("\n");

        }

    else

        printf("ERROR");

    return 0;

}

2.请编写一个完整的程序,使用顺序表实现以下任务。

(1)产生501~100的随机整数,将其中的偶数依次保存到顺序表中。

(2)输出顺序表的所有元素,并求顺序表的长度。

(3)在顺序表中指定位置i,插入一个新产生1~100的随机整数。

(4)删除顺序表中值为x的结点或指定位置i的结点。

(5)将顺序表按升序排列,并输出排序结果。

3.学生成绩表包括学号、姓名、数学成绩、英语成绩、平均成绩等字段。建立一个顺序表表示学生成绩表,请编写程序,实现以下任务。

(1)输人学号姓名、数学和英语成绩,直到输人学号为0结束。

(2)统计所有学生的平均成绩,并输出学生成绩表。

(3)插入一个新的学生记录,并将其插人到指定的结点位置。

(4)输入一个学生的学号,在成绩表中查找与输人学号相同的学生结点,若存在该学生记录,则输出其所有信息,否则输出“不存在此学号的学生"信息。

(5)输入一个学生的学号,在成绩表中查找与输人学号相同的学生结点,若存在该学生记录,则将其删除,否则输出“该学生不存在”的信息。

(6)将学生成绩按平均成绩从高到低进行排序,并输出排序结果。

源码:
#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define MAX_SIZE 50

// 顺序表结构体定义

typedef struct {

    int data[MAX_SIZE];

    int length;

} SeqList;

// 初始化顺序表

void initList(SeqList* L) {

    L->length = 0;

}

// 获取顺序表长度

int listLength(SeqList L) {

    return L.length;

}

// 判断顺序表是否为空

int isEmpty(SeqList L) {

    return L.length == 0;

}

// 判断顺序表是否已满

int isFull(SeqList L) {

    return L.length == MAX_SIZE;

}

// 在指定位置插入元素

void insert(SeqList* L, int index, int elem) {

    if (isFull(*L)) {

        printf("顺序表已满。\n");

        return;

    }

    if (index < 0 || index > L->length) {

        printf("无效的索引。\n");

        return;

    }

    for (int i = L->length; i > index; i--) {

        L->data[i] = L->data[i - 1];

    }

    L->data[index] = elem;

    L->length++;

}

// 删除指定位置的元素

void deleteElem(SeqList* L, int index) {

    if (isEmpty(*L)) {

        printf("顺序表为空。\n");

        return;

    }

    if (index < 0 || index >= L->length) {

        printf("无效的索引。\n");

        return;

    }

    for (int i = index; i < L->length - 1; i++) {

        L->data[i] = L->data[i + 1];

    }

    L->length--;

}

// 输出顺序表的所有元素

void printList(SeqList L) {

    printf("顺序表的元素:\n");

    for (int i = 0; i < L.length; i++) {

        printf("%d ", L.data[i]);

    }

    printf("\n");

}

// 生成501~100的随机整数,保存偶数到顺序表中

void generateRandomEvenNumbers(SeqList* L) {

    srand(time(NULL));

    for (int i = 0; i < 50; i++) {

        int num = rand() % 100 + 1;

        if (num % 2 == 0) {

            insert(L, L->length, num);

        }

    }

}

// 将顺序表按升序排列

void sortList(SeqList* L) {

    for (int i = 0; i < L->length - 1; i++) {

        for (int j = 0; j < L->length - 1 - i; j++) {

            if (L->data[j] > L->data[j + 1]) {

                int temp = L->data[j];

                L->data[j] = L->data[j + 1];

                L->data[j + 1] = temp;

            }

        }

    }

}

// 主函数

int main() {

    SeqList list;

    initList(&list);

    // 生成501~100的随机偶数,并保存到顺序表中

    generateRandomEvenNumbers(&list);

    // 输出顺序表的所有元素,并求顺序表的长度

    printList(list);

    printf("顺序表的长度为:%d\n", listLength(list));

    // 在顺序表中指定位置插入一个新产生1~100的随机整数

    int randomNum = rand() % 100 + 1;

    int insertIndex = 2; // 为示例将在第3个位置插入

    insert(&list, insertIndex, randomNum);

    // 输出插入后的顺序表

    printf("在第%d个位置插入%d后的顺序表:\n", insertIndex + 1, randomNum);

    printList(list);

    // 删除顺序表中值为x的结点或指定位置i的结点

    int deleteIndex = 4; // 为示例删除第5个位置的元素

    deleteElem(&list, deleteIndex);

    // 输出删除后的顺序表

    printf("删除第%d个位置元素后的顺序表:\n", deleteIndex + 1);

    printList(list);

    // 将顺序表按升序排列

    sortList(&list);

    // 输出排序后的顺序表

    printf("顺序表按升序排列后的结果:\n");

    printList(list);

    return 0;

}

三、心得体会:

通过学习和实践线性表相关知识,我深刻体会到线性表作为一种基本数据结构,在实际编程中具有重要作用。线性表的顺序存储结构和链式存储结构各有优缺点,可以根据具体需求选择适合的实现方式。通过顺序表的插入、删除、查找等操作,我深入理解了数据在顺序存储结构中的组织与管理方式,加深了对数组使用的认识。而链表的动态性和灵活性使得其在插入、删除操作中更具优势,带给我启发和思考。掌握线性表的操作,不仅提升了编程能力,更培养了逻辑思维和问题解决能力。在今后的学习和工作中,我将深入学习更多数据结构,不断提升自己的编程技能,为解决实际问题提供更多可能性。

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

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

相关文章

最常见的AI大模型总结

前言&#xff1a;大模型可以根据其主要的应领域和功能&#xff0c;可以分类为“文生文”&#xff08;Text-to-Text&#xff09;、“文生图”&#xff08;Text-to-Image&#xff09;和“文生视频”&#xff08;Text-to-Video&#xff09;&#xff0c;都是基于自然语言处理&#…

JVM从入门到放弃

前言&#xff1a;关于JVM&#xff0c;其实有很多大厂开发了不同版本的JVM&#xff0c;比较知名的有&#xff1a;Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、 Azul VM、 Apache Harmony、 Google Dalvik VM、 Microsoft JVM等等。现在使用的比较多的JDK8版本就是Sun HotSpot V…

「C++系列」指针

文章目录 一、指针的定义二、指针的基本概念1. 基本概念2. 案例代码示例 1&#xff1a;基本指针使用示例 2&#xff1a;指针与数组 3. 注意事项 三、指针的用途1. 指针的用途2. 案例代码案例1. 动态内存分配案例2. 函数参数&#xff08;通过指针修改值&#xff09;案例3. 数组和…

poky yocto(04):编译在vmware上运行的镜像

编译镜像 bitbake build-appliance-image 得到文件&#xff1a;build-appliance-image-qemux86-64.wic.vmdk 问题的关键来了&#xff0c;如何启动这个东西呢&#xff1f;由名字可知&#xff0c;这是一个vmware的硬盘文件&#xff0c;需要创建一个新的虚拟机加载它。 创建虚拟…

黑神话悟空游戏电脑配置要求 黑神话悟空Steam销量全球两连冠 黑神话悟空苹果笔记本电脑能玩吗 黑神话悟空是什么类型的游戏

相信不少游戏爱好者&#xff0c;近期被《黑神话&#xff1a;悟空》这款游戏刷屏了&#xff0c;备受期待的国产单机大作《黑神话:悟空》将于8月20日全球同步上线&#xff0c;登陆 PC (Steam / Epic / WeGame) 和 PS5 平台。凭借空前的关注度&#xff0c;该游戏有望成为国产游戏行…

sql注入漏洞复现

and 11 正常 and 12 报错 从这就已经说明是sql数字型注入了 上sqlmap验证一下 存在布尔盲注&#xff0c;时间盲注...... 我是在漏洞盒子上提交的&#xff0c;能不能通过看运气吧 下面这个漏洞已经是很久之前的了&#xff0c;现在已经是修复了&#xff0c;当时还是太年轻了...…

文献阅读:扩散波模型的物理信息神经网络

目录 摘要 Abstract 扩散波模型的物理信息神经网络 文献摘要 讨论|结论 理论知识 扩散波动方程&#xff08;曼宁方程&#xff09; 梯度停止&#xff08;Stop-gradient&#xff09;技术 时分PINN(TPINN) 新结构(fPINN) 实验设置 稳定流问题 等速和扩散问题 非线性速…

基于STM32的简易音频播放系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码音频播放代码应用场景 简易音频播放语音提示系统常见问题及解决方案 常见问题解决方案结论 1. 引言 音频播放系统在日常生活中有着广泛的应用&#xff0c;从简单的语音提示到复杂…

基于Transformer的语音识别与音频分类

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

如果我的发明有修改,需要如何处理?

如果我的发明有修改&#xff0c;需要如何处理&#xff1f;

近期关于云服务器window server 2012屏蔽游戏加速器/IP加速器模拟IP连接限制策略

winr 打开运行 输入 gpedit.msc 找到本地组策略编辑器的对应设置 设置启用即可。

【redis 第七篇章】动态字符串

一、概述 string 类型底层实现的简单动态字符串 sds&#xff0c;是可以修改的字符串。它采用预分配冗余空间的方式来减少内存的频繁分配。 二、SDS动态字符串 动态字符串 是以 \0 为分隔符。最大容量 是 redis 主动分配的一块内存空间&#xff0c;实际存储内容 是具体的存的数…

BACnet 调试工具 工程师必备

文章目录 BACnet 调试工具 工程师必备主要功能软件截图 BACnet 调试工具 工程师必备 官网地址 BACnet&#xff08;Building Automation and Control Networks&#xff09;是由美国采暖、制冷与空调工程师学会&#xff08;American Society of Heating, Refrigerating and Air…

【网络层】IP报文解析和网段划分

文章目录 网络层的作用IP协议协议报头格式网段划分DHCPCIDR划分方案 IP地址的数量限制私有IP地址和公网IP地址LAN和WAN 路由 网络层的作用 前面学习了应用层和传输层&#xff0c;应用层的作用是为用户和应用程序提供网络服务&#xff0c;传输层的作用是提供端口到端口的通信服…

Android 10.0 系统默认蓝牙打开状态栏显示蓝牙图标功能实现

1.前言 在10.0的系统rom定制化开发过程中,在默认系统中,打开蓝牙开关的时候不会状态栏不会显示蓝牙图标,而只有 蓝牙连接成功后会显示蓝牙图标,客户开发需要要求在蓝牙打开的时候在状态栏就显示蓝牙图标,接下来分析下 相关的状态栏图标显示流程,然后实现相关功能 2.系统…

模块的介绍

一、模块的基本介绍 1、模块是什么&#xff1f; 1&#xff09;模块是一个py文件&#xff0c;后缀名.py 2&#xff09;模块可以定义函数、类和变量&#xff0c;模块里也可能包含可执行的代码 2、模块的作用有哪些&#xff1f; 1&#xff09;当函数、类、变量很多时&#xf…

java基础--字符串用法

一、前言&#xff08;在java中字符串的重要性&#xff09; 在 Java 编程中&#xff0c;字符串&#xff08;String&#xff09;的重要性不言而喻&#xff0c;它几乎贯穿于所有的应用程序和系统中。以下是 Java 中字符串重要性的几个方面&#xff1a; 1. 数据表示和处理 文本数…

使用PXE和kickstart完成自动化批量主机的安装

本实验采用的版本为rhel7.9 kickstart&#xff1a; 首先写一个kickstart脚本 安装脚本工具 配置自动化脚本 下载http服务用来共享脚本 yum install httpd -y systemctl enable httpd --now 实验的过程中把防火墙和selinux都关闭 配置自动化脚本 创建一个软链接使得用户访…

集团ERP信息化项目实施方案(可编辑82页PPT)

引言&#xff1a;在当前信息化快速发展的时代&#xff0c;集团企业面临着日益增长的业务复杂性和数据管理挑战。为了提升集团的整体运营效率、加强数据集成与共享、优化业务流程&#xff0c;我们决定实施ERP&#xff08;企业资源计划&#xff09;信息化项目。 方案介绍&#x…

最新口型同步技术EchoMimic部署

EchoMimic是由蚂蚁集团推出的一个 AI 驱动的口型同步技术项目&#xff0c;能够通过人像面部特征和音频来帮助人物“对口型”&#xff0c;生成逼真的动态肖像视频。 EchoMimic的技术亮点在于其创新的动画生成方法&#xff0c;它不仅能够通过音频和面部关键点单独驱动图像动画&a…