【C语言数据结构】模拟·顺序表·总项目实现

简介: 我在上一篇博客中,详细讲解啦每一个函数的实现思路和代码展现,在这一篇博客中,我将像是做项目一样,去实现顺序表的总体实现。

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤

📃个人主页 :阿然成长日记点击可跳转

📆 个人专栏: 🔹数据结构与算法🔹C语言进阶

🚩 不能则学,不知则问,耻于问人,决无长进

🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

前言

我在上一篇博客中,详细讲解啦每一个函数的实现思路和代码展现,在这一篇博客中,我将像是做项目一样,去实现顺序表的总体实现。

一、项目源文件构成

该项目由三部分组成

1️⃣ 用来存放库函数,宏定义,函数申明等的一个头文件:SqList.h

2️⃣ 主函数的所在文件 test.c

3️⃣各个函数的实现,我们主要在此完成函数的代码编写:SqList.c、

二、菜单

建立一个菜单是很重要的,菜单能够实现和用户的交互,以便于用户的操作。

代码如下:

void meun()
{
  printf("**************************************************\n");
  printf("*    1.顺序表尾插            2.顺序表尾删        *\n");
  printf("*    3.顺序表头插            4.顺序表头删        *\n");
  printf("*    5.顺序表的查找          6.在pos位置插入x    *\n");
  printf("*    7.删除pos位置的值       8.顺序表的打印      *\n");
  printf("*    0.退出                                      *\n");
  printf("**************************************************\n");
}

三、顺序表结构体

typedef int SLDataType;
typedef struct SeqList
{
  SLDataType* array;
  int size;//当前存储个数
  int capacity;//空间大小
}SL;

四、源文件展示

下面是整个项目的代码:

1.SqList.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#define INT_SIZE 2
typedef int SLDataType;
typedef struct SeqList
{
  SLDataType* array;
  int size;//当前存储个数
  int capacity;//空间大小
}SL;
//顺序表的初始化
void SeqListInit(SL* ps);
// 顺序表尾插
void SeqListPushBack(SL* ps, SLDataType x);
// 顺序表尾删
void SeqListPopBack(SL* ps);
// 顺序表头插
void SeqListPushFront(SL* p, SLDataType x);
// 顺序表头删
void SeqListPopFront(SL* p);
// 顺序表查找
int SeqListFind(SL* p, SLDataType x);
// 顺序表在pos位置插入x
void SeqListInsert(SL* p, size_t pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SL* p, size_t pos);
// 顺序表销毁
void SeqListDestory(SL* p);
// 顺序表打印
void SeqListPrint(SL* p);

2.SqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SqList.h"
//顺序表的初始化
void SeqListInit(SL* ps)
{
  ps->array = (SLDataType*)malloc(sizeof(SLDataType)*4);
  if (ps->array == NULL)
  {
    perror("malloc failed\n");
    exit(-1);
  }
  ps->size = 0;
  ps->capacity = 4;
}
// 检查空间,如果满了,进行增容
int CheckCapacity(SL* ps)
{
  if (ps->size == ps->capacity)
  {
    SLDataType* tmp = (SLDataType*)realloc(ps->array, (ps->capacity + INT_SIZE)*sizeof(SLDataType));
    if (tmp == NULL)
    {
      perror("扩容失败!\n");
      return 0;
    }
    else
    {
      ps->array = tmp;
      ps->capacity += INT_SIZE;
      printf("扩容成功\n");
      return 1;
    } 
  }
  return 1;
}
// 顺序表销毁
void SeqListDestory(SL* ps)
{
  free(ps->array);
  ps->array = NULL;
  ps->capacity = 0;
  ps->size = 0;
}
// 顺序表尾插
void SeqListPushBack(SL* ps, SLDataType x)
{
  if (CheckCapacity(ps) == 0)
  {
    printf("空间已满,插入失败!\n");
  }
  if (CheckCapacity(ps) == 1)
  {
    ps->array[ps->size] = x;
    ps->size ++;
  }
}
// 顺序表尾删
void SeqListPopBack(SL* ps)
{
  if (ps->size < 1)
  {
    printf("已经为空,无元素可删除\n");
    return;
  }
  ps->array[ps->size - 1] = 0;
  ps->size--;
}
// 顺序表头插
void SeqListPushFront(SL* ps, SLDataType x)
{
  //判断空间是否够。
  //先挪动
  if (CheckCapacity(ps) == 0)
  {
    printf("空间已满,头插入失败!\n");
  }
  if (CheckCapacity(ps) == 1)
  {
  int end = ps->size - 1;
  while (end>=0)
  {
    ps->array[end + 1] = ps->array[end];
    end--;
  }
  ps->array[0] = x;
  ps->size++;
  }
}
// 顺序表头删
void SeqListPopFront(SL* ps)
{
  int n = 1;
  while (n < ps->size)
  {
    ps->array[n - 1] = ps->array[n];
    n++;
  }
  ps->size--;
}
// 顺序表打印
void SeqListPrint(SL* ps)
{
  for (int i = 0; i < ps->size; i++)
  {
    printf("%d ", ps->array[i]);
  }
  printf("\n");
}
// 顺序表查找
int SeqListFind(SL* ps, SLDataType x)
{
  int i = 0,count=0;
  for (i = 0; i < ps->size - 1; i++)
  {
    if (x == ps->array[i])
    {
      printf("找到啦!下标是%d\n",i);
      count++;
      return i;
    }
  }
  if (count == 0)
  {
    printf("没找到!\n");
    return;
  }
}
// 顺序表在pos位置插入x
void SeqListInsert(SL* ps, size_t pos, SLDataType x)
{
  assert(pos>=0&&pos<ps->size);
  if (CheckCapacity(ps) == 0)
  {
    printf("空间已满,插入失败!\n"); 
  }
  if (CheckCapacity(ps) == 1)
  {
    int end = ps->size - 1 ;
    while (end >= pos)
    {
      ps->array[end + 1] = ps->array[end];
      end--;
    }
    ps->array[pos] = x;
    ps->size++;
  }
}
// 顺序表删除pos位置的值
void SeqListErase(SL* ps, size_t pos)
{
  assert(pos >= 0 && pos < ps->size);
  int n = pos + 1;
  while (n <= ps->size - 1)
  {
    ps->array[n - 1] = ps->array[n];
    n++;
  }
  ps->size--;
}

3.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SqList.h"
void meun()
{
  printf("**************************************************\n");
  printf("*    1.顺序表尾插            2.顺序表尾删        *\n");
  printf("*    3.顺序表头插            4.顺序表头删        *\n");
  printf("*    5.顺序表的查找          6.在pos位置插入x    *\n");
  printf("*    7.删除pos位置的值       8.顺序表的打印      *\n");
  printf("*    0.退出                                      *\n");
  printf("**************************************************\n");
}
int main()
{
  int x,pos;
  SL s;
  //初始化
  SeqListInit(&s);
  int input = 0;
  do
  {
    meun();
    printf("请输入你的选择:\n");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      printf("请输入要尾插的值:");
      scanf("%d", &x);
      SeqListPushBack(&s, x);
      break;
    case 2:
      SeqListPopBack(&s);
      break;
    case 3:
      printf("请输入要头插的值:");
      scanf("%d", &x);
      SeqListPushFront(&s,x);
      break;
    case 4:SeqListPopFront(&s);
      break;
    case 5:
      printf("请输入要查找的值:");
      scanf("%d", &x);
      SeqListFind(&s,x); 
      break;
    case 6:
    {
      printf("请输入要插入的位置和数据(空格分开):");
      scanf("%d %d", &pos,&x);
      SeqListInsert(&s, pos, x);
      break;
    }
    case 7:
      printf("请输入要删除的位置:");
      scanf("%d", &pos);
      SeqListErase(&s,pos); 
      break;
    case 8:
       SeqListPrint(&s);
       break;
    case 0:
      SeqListDestory(&s);
      break;
    default:printf("输入有误,请重新输入:\n");
    }
  }while (input);
}

五、运行截图

1.顺序表尾插,头插展示

2.顺序表的头删

3.顺序表的尾删

4.顺序表的查找

5.在pos位置插入x

6.在pos位置删除元素

总结:

本次项目当中遇到许多之气没有注意到的问题,尤其是数组越界问题等等,在接下来学习数据结构预算法是非常重要的,🌈相信自己,踏踏实实走好每一步,梦想终会成为现实! ⛵️

相关文章
|
3月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
91 1
|
2天前
|
定位技术 C语言
c语言及数据结构实现简单贪吃蛇小游戏
c语言及数据结构实现简单贪吃蛇小游戏
|
20天前
|
搜索推荐 C语言
数据结构(C语言)之对归并排序的介绍与理解
归并排序是一种基于分治策略的排序算法,通过递归将数组不断分割为子数组,直到每个子数组仅剩一个元素,再逐步合并这些有序的子数组以得到最终的有序数组。递归版本中,每次分割区间为[left, mid]和[mid+1, right],确保每两个区间内数据有序后进行合并。非递归版本则通过逐步增加gap值(初始为1),先对单个元素排序,再逐步扩大到更大的区间进行合并,直至整个数组有序。归并排序的时间复杂度为O(n*logn),空间复杂度为O(n),且具有稳定性,适用于普通排序及大文件排序场景。
|
1月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
41 5
|
2月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
3月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
328 9
|
3月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
53 1
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77