实现顺序表——实践报告

news2024/11/24 21:25:49

W...Y的主页 😊

代码仓库分享 💕 


目录

一、实验目的:

二、实验内容:

三、实验要求:

四.实验步骤(给出每个函数的算法描述):

五.实验结果:

 六.源代码


实验名称 : 顺序表的基本操作

一、实验目的:

1、复习C语言程序设计中的知识。

2、掌握线性表的顺序存储结构的表示和实现方法。

3、掌握顺序表基本操作的算法实现。

二、实验内容:

1.建立顺序表。

2.在顺序表上实现插入、删除和查找等操作。

三、实验要求:

1. 编写实现顺序表的基本算法(初始化、查找、插入、删除等)的函数,并在此基础上设计一个主程序完成如下功能:

⑴初始化一个顺序表L,数据元素类型可任选;

⑵建立顺序表L,要求数据元素至少10个;

⑶输出顺序表L的长度;

⑷按位置查找:输出顺序表L的第i个元素,如第3个元素;

⑸按内容查找:输出给定元素的位置;

⑹在第i个元素前插入给定元素;

⑺删除顺序表L的第i个元素;

遍历顺序表,将表中的元素按序输出。

编写菜单,以便用户可以选择相应的操作。

2. 利用顺序表的基本操作,求两个集合AB的交集、并集和差集。

四.实验步骤(给出每个函数的算法描述):

下面是使用 C 语言实现顺序表的一般步骤:

1.定义结构体:首先,你需要定义一个结构体来表示顺序表。该结构体至少应包含两个成员:一个数组来存储数据元素,以及一个整型变量来记录当前元素的数量。

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int length;
} SeqList;


2.初始化顺序表:创建一个函数来初始化顺序表。这将包括将顺序表的 length 成员设置为 0。

void init(SeqList *list) {
    list->length = 0;
}


3.插入元素:创建一个函数用于在顺序表中插入元素。这将包括将新元素添加到数组中,并增加 length 变量的值。

int insert(SeqList *list, int index, int element) {
    if (index < 0 || index > list->length || list->length == MAX_SIZE) {
        return 0;  // 插入失败
    }

    // 将 index 位置及其后面的元素后移一位
    for (int i = list->length - 1; i >= index; i--) {
        list->data[i + 1] = list->data[i];
    }

    // 在 index 位置插入新元素
    list->data[index] = element;
    list->length++;

    return 1;  // 插入成功
}


4.删除元素:创建一个函数用于从顺序表中删除元素。这将涉及将指定位置的元素删除,并将后面的元素向前移动。

int remove(SeqList *list, int index) {
    if (index < 0 || index >= list->length) {
        return 0;  // 删除失败
    }

    // 将 index 位置后面的元素前移一位
    for (int i = index + 1; i < list->length; i++) {
        list->data[i - 1] = list->data[i];
    }

    list->length--;

    return 1;  // 删除成功
}


5.查找元素:创建一个函数用于在顺序表中查找指定元素。这将涉及遍历顺序表的元素,并与目标元素进行比较。

int search(SeqList *list, int element) {
    for (int i = 0; i < list->length; i++) {
        if (list->data[i] == element) {
            return i;  // 返回元素位置
        }
    }

    return -1;  // 找不到元素
}


6.打印顺序表:创建一个函数来打印顺序表的所有元素。

void print(SeqList *list) {
    for (int i = 0; i < list->length; i++) {
        printf("%d ", list->data[i]);
    }

    printf("\n");
}

当完善顺序表的实验步骤时,你可以考虑添加以下功能:

1.获取指定位置的元素:创建一个函数,用于获取指定位置的元素值。

int getElement(SeqList *list, int index) {
    if (index < 0 || index >= list->length) {
        return -1;  // 获取失败,返回一个特定的错误值
    }

    return list->data[index];
}


2.更新指定位置的元素:创建一个函数,用于更新指定位置的元素值。

int updateElement(SeqList *list, int index, int newElement) {
    if (index < 0 || index >= list->length) {
        return 0;  // 更新失败
    }

    list->data[index] = newElement;

    return 1;  // 更新成功
}


3.清空顺序表:创建一个函数,用于清空顺序表中的所有元素。

void clear(SeqList *list) {
    list->length = 0;
}

这些是一些常见的功能,可以帮助完善顺序表的实验步骤。在实际应用中,你还可以根据需要扩展其他功能,例如顺序表的动态扩容、按值查找等。确保在修改完善代码后,进行编译和测试,以确保顺序表的正确性和稳定性。

五.实验结果:

初始化成功

销毁顺序表       

  1. 头部插入

  1. 尾部插入   

  1.  头部删除

  1. 尾部删除

查找想要pos位置的元素下标 

 六.源代码

Seqlist.h文件
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

typedef int SLDateType;
typedef struct SeqList
{
	SLDateType* a;
	int size;
	int capacity;
}SL;

// 对数据的管理:增删查改 
//初始化
void SeqListInit(SL* ps);
//销毁
void SeqListDestroy(SL* ps);
//打印
void SeqListPrint(SL* ps);
//尾插
void SeqListPushBack(SL* ps, SLDateType x);
//头插
void SeqListPushFront(SL* ps, SLDateType x);
//头删
void SeqListPopFront(SL* ps);
// 尾删
void SeqListPopBack(SL* ps);
//检测空间是否需要扩容
void SLCheckCapacity(SL* ps);
//
 顺序表查找
int SeqListFind(SL* ps, SLDateType x);
 顺序表在pos位置插入x
void SeqListInsert(SL* ps, int pos, SLDateType x);
 顺序表删除pos位置的值
void SeqListErase(SL* ps, int pos);
Seqlist.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"

void SeqListInit(SL* ps)
{
	ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);
	if (ps->a == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	ps->size = 0;
	ps->capacity = 4;
}
void SeqListDestroy(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->size = 0;
	ps->capacity = 0;
}

void SeqListPrint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}
void SLCheckCapacity(SL* ps)
{
	if (ps->size == ps->capacity)
	{
		SLDateType* p = (SLDateType*)realloc(ps->a, sizeof(ps->a) * 2);
		if (*p == NULL)
		{
			perror(realloc);
			exit(-1);
		}
		ps->capacity *= 2;
		ps->a = p;
	}
}
void SeqListPushBack(SL* ps, SLDateType x)
{
	SLCheckCapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;
}
void SeqListPopBack(SL* ps)
{

	assert(ps->size > 0);
	/*if (ps->sz == 0)
	{
		return;
	}*/
	ps->size--;
}
void SeqListPushFront(SL* ps, SLDateType x)
{
	SLCheckCapacity(ps);
	for (int i = ps->size; i > 0; i--)
	{
		ps->a[i] = ps->a[i - 1];
	}
	ps->a[0] = x;
	ps->size++;
}

void SeqListPopFront(SL* ps)
{
	assert(ps->size > 0);
	for (int i = 0; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}
void SeqListInsert(SL* ps, int pos, SLDateType x)
{
	assert(pos >= 0 && pos <= ps->size);
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		--end;
	}
	ps->a[pos] = x;
	ps->size++;
}
void SeqListErase(SL* ps, int pos)
{
	assert(ps->size > 0);
	for (int i = pos - 1; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}
int SeqListFind(SL* ps, SLDateType x)
{
	assert(ps->size > 0);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
			return i;
	}
	return -1;
}
Test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"Seqlist.h"
void menu()
{
	printf("******************************************************\n");
	printf("*******      线 性 表                           ******\n");
	printf("*******  1.初始化顺序表                         ******\n");
	printf("*******  2. 销毁顺序表                          ******\n");
	printf("*******  3.   头部插入                          ******\n");
	printf("*******  4.   尾部插入                          ******\n");
	printf("*******  5.   头部删除                          ******\n");
	printf("*******  6.   尾部删除                          ******\n");
	printf("*******  7. 在pos位置插入给定元素               ******\n");
	printf("*******  8. 删除pos位置的元素                    *****\n");
	printf("*******  9. 遍历顺序表,将表中的元素按序输出    ******\n");
	printf("*******  10. 查找想要pos位置的元素下标           *****\n");
	printf("*******  0.        退出程序              ***********\n\n");
	printf("----------------------------------------------------\n\n");
}
int main()
{
	SL sl;
	int choose = 0;
	do
	{
		menu();
		printf("请选择需要的功能:");
		scanf("%d", &choose);
		if (!(choose >= 0 && choose <= 10))
		{
			printf("非法输入,重新输入(范围0~10)\n");
			continue;
		}
		switch (choose)
		{
		case 1:
		{
			SeqListInit(&sl);
			printf("初始化成功\n");
			break;
		}
		case 2:
		{
			SeqListDestroy(&sl);
			printf("销毁成功\n");
			break;
		}
		case 3:
		{
			int num = 0;
			printf("输入存放值:");
			scanf("%d", &num);
			SeqListPushFront(&sl, num);
			break;
		}
		case 4:
		{
			int num = 0;
			printf("输入存放值:");
			scanf("%d", &num);
			SeqListPushBack(&sl, num);
			break;
		}
		case 5:
		{
			SeqListPopFront(&sl);
			break;
		}
		case 6:
		{
			SeqListPopBack(&sl);
			break;
		}
		case 7:
		{
			int num = 0;
			int pos = 0;
			printf("输入存放值:");
			scanf("%d", &num);
			printf("\n输入想要放置的pos位:");
			scanf("%d", &pos);
			SeqListInsert(&sl, pos, num);
			break;
		}
		case 8:
		{
			int pos = 0;
			printf("\n输入想要删除的pos位:");
			scanf("%d", &pos);
			SeqListErase(&sl, pos);
			break;
		}
		case 9:
		{
			SeqListPrint(&sl);
			break;
		}
		case 10:
		{
			int num = 0;
			printf("输入寻找pos位的元素:");
			scanf("%d", &num);
			printf("%d\n",SeqListFind(&sl, num));
			break;
		}
		case 0: printf("结束程序\n");
		}

	} while (choose);
	return 0;

}

以上代码需要不能直接应用,需要在三个文件中使用,在借鉴使用同时,如果有不明白的地方可以私信博主,博主在线解答。

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

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

相关文章

【深度学习实验】前馈神经网络(五):自定义线性模型:前向传播、反向传播算法(封装参数)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 线性模型Linear类 a. 构造函数__init__ b. __call__(self, x)方法 c. 前向传播forward d. 反向传播backward 2. 模型训练 3. 代码整合 一、实验介绍 实现线性…

【计算机网络】IP协议(下)

文章目录 1. 特殊的IP地址2. IP地址的数量限制3. 私有IP地址和公网IP地址私有IP为什么不能出现在公网上&#xff1f;解决方案——NAT技术的使用 4. 路由5. IP分片问题为什么要进行切片&#xff1f;如何做的分片和组装&#xff1f;16位标识3位标志13位片偏移例子 细节问题如何区…

一文带你玩转logo:含义、获取、使用以及2000多知名logo大图资源

大家好&#xff01;logo是我们非常熟悉的一种事物&#xff0c;但是我发现很多场合的logo使用并不规范、高效&#xff0c;所以今天六分成长来带着大家了解一下关于logo的方方面面。 一、什么是logo&#xff1f; logo不是某一些英文单词的缩写&#xff0c;是一个完整的单词&…

uniapp如何判断是哪个(微信/APP)平台

其实大家在开发uniapp项目的时候长长会遇到这样一个问题&#xff0c;就是针对某些小程序&#xff0c;没发去适配相关的功能&#xff0c;所以要针对不同的平台&#xff0c;进行不同的处理。 #ifdef &#xff1a; if defined 仅在某个平台编译 #ifndef &#xff1a; …

机器学习实验一:使用 Logistic 回归来预测患有疝病的马的存活问题

代码&#xff1a; import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report import matplotlib.pyplot as plt def train(): # …

机器学习---神经元模型

1. 生物学的启示 神经元在结构上由细胞体、树突、轴突和突触四部分组成。 细胞体是神经元的主体&#xff0c;由细胞核、细胞质和细胞膜3部分组成。细胞体的外部是细胞膜&#xff0c;将 膜内外细胞液分开。由于细胞膜对细胞液中的不同离子具有不同的通透性&#xff0c;这使得膜…

XXE 漏洞及案例实战

文章目录 XXE 漏洞1. 基础概念1.1 XML基础概念1.2 XML与HTML的主要差异1.3 xml示例 2. 演示案例2.1 pikachu靶场XML2.1.1 文件读取2.1.2 内网探针或者攻击内网应用&#xff08;触发漏洞地址&#xff09;2.1.4 RCE2.1.5 引入外部实体DTD2.1.6 无回显读取文件 3. XXE 绕过3.1 dat…

【操作系统】线程、多线程

为什么要引入线程&#xff1f; 传统的进程只能串行的执行一系列程序&#xff0c;线程增加并发度。同一个进程分为多个线程。 线程是调度的基本单元&#xff0c;程序执行流的最小单位&#xff0c;基本的CPU执行单元。 进程是资源分配的基本单位。 线程的实现方式 用户级线程 代…

Unity入门教程(上)

七、运行游戏 再次保存我们的项目文件&#xff08;返回步骤四&#xff09;。保存完成后&#xff0c;让我们把游戏运行起来。 1&#xff0c;确认游戏视图标签页右上方的Maximize on Play图标处于按下状态&#xff0c;然后点击画面上方的播放按钮&#xff08;位于工具栏中间的播…

C++类模板学习

之前已经学习了函数模板&#xff0c;在这里&#xff0c; C函数模板Demo - win32 版_c编写的opc da demo_bcbobo21cn的博客-CSDN博客 下面学习类模板&#xff1b; VC6&#xff1b; 做一个星星类&#xff0c;Star&#xff1b; Star.h&#xff1b; #if !defined(AFX_STAR_H_…

(十二)VBA常用基础知识:worksheet的各种操作之sheet移动

当前sheet确认 把sheet1移动到sheet3前边 Sub Hello()10Worksheets("Sheet1").Move Before:Worksheets("Sheet3") End Sub3. 把sheet2移动到sheet1后边 Sub Hello()11Worksheets("Sheet2").Move after:Worksheets("Sheet1") End Sub…

MissionPlanner编译过程

环境 windows 10 mission planner 1.3.80 visual studio 2022 git 2.22.0 下载源码 (已配置git和ssh) 从github上克隆源码 git clone gitgithub.com:ArduPilot/MissionPlanner.git进入根目录 cd MissionPlanner在根目录下的ExtLibs文件下是链接的其它github源码&#xff0…

pymysql简介以及安装

视频版教程 Python操作Mysql数据库之pymysql模块技术 前面基础课程介绍了使用文件来保存数据&#xff0c;这种方式虽然简单、易用&#xff0c;但只适用于保存一些格式简单、数据量不太大的数据。对于数据量巨大且具有复杂关系的数据&#xff0c;当然还是推荐使用数据库进行保存…

79、SpringBoot 整合 R2DBC --- R2DBC 就是 JDBC 的 反应式版本, R2DBC 是 JDBC 的升级版。

★ 何谓R2DBC R2DBC 就是 JDBC 的 反应式版本&#xff0c; R2DBC 是 JDBC 的升级版。 R2DBC 是 Reactive Relational Database Connectivity (关系型数据库的响应式连接) 的缩写 反应式的就是类似于消息发布者和订阅者&#xff0c;有消息就进行推送。R2DBC中DAO接口中方法的…

Rust vs C++ 深度比较

Rust由于其强大的安全性受到大量关注&#xff0c;被认为C在系统编程领域最强大的挑战者。本文从语言、框架等方面比较了两者的优缺点。原文: Rust vs C: An in-depth language comparison Rust和C的比较是开发人员最近的热门话题&#xff0c;两者之间有许多相似之处&#xff0c…

Linux复习-安装与熟悉环境(一)

这里写目录标题 虚拟机ubuntu系统配置镜像Linux命令vi编辑器3个模式光标命令vi模式切换命令vi拷贝与粘贴命令vi保存和退出命令vi的查找命令vi替换命令 末行模式复制、粘贴、剪切gcc编译器 虚拟机 VMware16 官网下载&#xff1a;vmware官网 网盘下载&#xff1a; 链接&#xff…

共享文件夹设置密码怎么做?3招轻松为文件上锁!

“我们小组里建了一个共享文件夹&#xff0c;为了安全起见&#xff0c;想给文件夹设置一个密码&#xff0c;但是不知道应该怎么操作&#xff0c;有没有大佬可以教教我呀&#xff01;” 在我们的工作中&#xff0c;经常都会用到共享文件&#xff0c;这样可以让我们的工作方便快捷…

Jmeter接口测试

前言&#xff1a; 本文主要针对http接口进行测试&#xff0c;使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较成熟&#xff0c;因此&#xff0c;本次直接使用Jmeter工具来完成对Http接口的测试。 1.介绍什么是…

负载均衡技术全景:理论、实践与案例研究

在当今的互联网时代&#xff0c;随着用户数量的增长和业务规模的扩大&#xff0c;单一的服务器已经无法满足高并发、大流量的需求。为了解决这个问题&#xff0c;负载均衡技术应运而生。负载均衡可以将大量的网络请求分发到多个服务器上进行处理&#xff0c;从而提高系统的处理…

Qt-双链表的插入及排序

输入一个二维链表将其排序后转化成一维链表 要求&#xff1a;链表自定义不得使用模板库 链接&#xff1a;私信