实现顺序表——实践报告

简介: 实现顺序表——实践报告

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

一、实验目的:

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

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

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

二、实验内容:

1.建立顺序表。

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

三、实验要求:

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


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


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


⑶输出顺序表L的长度;


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


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


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


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


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


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


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

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

下面是使用 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;
}

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

五.实验结果:

初始化成功

b38521b402f642a99123e41b3ebe146a.png

销毁顺序表      

455bbe63c31041e29a8e9a6d297822a0.png

  1. 头部插入

5a717995701449a8918217d41acdf37f.png

d8827dd309cd417cb3713e3a2a88468e.png

  1. 尾部插入  

63c4c67f0d2541d0914c833da41e47e1.png

4c88962977c1463d94fdd128df7c657e.png

  1. 头部删除

3a3b856b412946ebb009d4397d60cc5a.png

  1. 尾部删除

da8974abf7af4d35a90dbe269c6f1b62.png

4a0f7110ff044c05b97aec7ac4fb8f86.png

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

97075f280d2d4dc587f2dd80b226ec4f.png

六.源代码

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;
}

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

目录
相关文章
|
JavaScript 前端开发 C++
初学Qt不会样式表怎么办,打包好的Qt样式表一键生成送给你。
很多人应该和我一样,想做界面才接触的Qt,结果就是做不出来华丽的界面,想给控件上个色?不会,百度半天,好不容易给控件添加了背景色,下一个控件又不会了,别急,这次福利来了,我将平时用到的样式表做了一个总结,并做了一个一键生成,调节数据就可以实时显示,里面包括了Label,LineEdit,PushButton,CheckBox,RadioButton,ScrollBar,Slider,Progressbar,Tabwidget,ToolBox,TabWidget控件的自定义。代码很简单,就是重复写槽函数,但其对于新手的学习很有帮助,避免了盲目,大量的通过百度数据拼接样式表。一来方便学习,所以参数
1493 1
初学Qt不会样式表怎么办,打包好的Qt样式表一键生成送给你。
|
6月前
|
自然语言处理
🏗️ 主流大模型结构
本文系统梳理主流大模型架构:Encoder-Decoder、Decoder-Only、Encoder-Only与Prefix-Decoder,解析GPT、LLaMA、BERT等代表模型演进与特点,对比参数量、上下文长度等关键指标,深入探讨中文模型优化及面试高频问题,助力全面掌握大模型技术脉络。(238字)
|
人工智能 自动驾驶 安全
人工智能浪潮下的伦理困境与未来展望
在AI技术飞速发展的今天,我们站在了一个新的历史节点上。本文将探讨人工智能带来的伦理挑战,并展望未来可能的发展路径。我们将从AI技术的本质出发,分析其对社会、工作和人际关系的影响,进而深入讨论如何平衡技术进步与人类价值的关系,最后提出对未来AI发展的展望和建议。
827 2
|
存储 缓存 安全
Overlay Filesystem 【ChatGPT】
Overlay Filesystem 【ChatGPT】
|
关系型数据库 MySQL Docker
PolarDB-X安装部署初体验
本文档介绍了体验阿里云PolarDB-X分布式数据库的安装和使用过程。首先提到PolarDB-X在稳定性及性能上的优势,然后详细描述了在CentOS 7环境下遇到的Python版本不兼容和Docker容器iptables配置问题的解决方法。通过创建Python 3.8的虚拟环境解决PyYAML依赖问题,接着在解决Docker容器内部网络问题后,成功安装并启动PolarDB-X。文中强调PolarDB-X完全兼容MySQL,适合熟悉MySQL的用户,并分享了安装历史记录以供参考。
835 7
|
编解码 开发工具 开发者
Flutter 中的 WidgetInspector 小部件:全面指南
但它主要用于调试目的,在生产环境中应该谨慎使用。
440 2
|
SQL 流计算
Flink SQL 功能解密系列 —— 数据去重的技巧和思考
去重逻辑在业务处理中使用广泛,大致可以分两类:DISTINCT去重和FIRST_VALUE主键去重,两者的区别是DISTINCT去重是对整行数据进行去重,比如tt里面数据可能会有重复,我们要去掉重复的数据;FIRST_VALUE是根据主键进行去重,可以看成是一种业务层面的去重,但是真实的业务场景使用也很普遍,比如一个用户有多次点击,业务上只需要取第一条。
|
存储 机器学习/深度学习 数据挖掘
时序数据库 TDengine 与高级分析软件 Seeq 集成,来看看操作手册
通过 TDengine Java connector,Seeq 可以轻松支持查询 TDengine 提供的时序数据,并提供数据展现、分析、预测等功能。本文将对此进行介绍。
767 2
MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。
在比赛中遇到了MP的并列柱状图,看网上对这方面记录并不是很多,所以今天就做一个教程吧。
563 0
MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。
|
API Python
python 通过 github api 上传图片,实现免费的图床
python 通过 github api 上传图片,实现免费的图床
1449 0