【数据结构和算法】实现线性表中的静态、动态顺序表(下)

简介: 【数据结构和算法】实现线性表中的静态、动态顺序表(下)

五、完整代码演示

1.静态顺序表

所谓静态,就是指,不能更改顺序表最大存储元素个数,可能剩下很多,也可能不够

1.test.c

主函数的使用

#define _CRT_SECURE_NO_WARNINGS
#include"Seqtable.h"
//实现顺序表
void test1()
{
  Seqtable st;
  InitSeqtable(&st);//初始化
  //尾插
  BackSeqtable(&st, 1);
  BackSeqtable(&st, 2);
  BackSeqtable(&st, 3);
  BackSeqtable(&st, 4);
  BackSeqtable(&st, 5);
  //打印
  PrintSeqtable(&st);
  printf("\n");
  //头插
  FrontSeqtable(&st, 1);
  FrontSeqtable(&st, 2);
  FrontSeqtable(&st, 3);
  FrontSeqtable(&st, 4);
  FrontSeqtable(&st, 5);
  PrintSeqtable(&st);
  //尾巴删除
  SeqtablePopBack(&st);
  SeqtablePopBack(&st);
  SeqtablePopBack(&st);
  SeqtablePopBack(&st);
  SeqtablePopBack(&st);
  printf("\n");
  //打印
  PrintSeqtable(&st);
  //头删除
  SeqtablePopFront(&st);
  printf("\n");
  //打印
  PrintSeqtable(&st);
  摧毁顺序表
  //SeqtableDestory(&st);
  printf("\n");
  //打印
  ChangeSeqtable(&st);
  PrintSeqtable(&st);
}
int main()
{ //实现静态顺序表
  test1();
  return 0;
}

2.Seqtable.h

头文件的使用

#define _CRT_SECURE_NO_WARNINGS
//头文件,进行函数的声明
//    结构体的实现
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<malloc.h>
#define MAX 100
//静态顺序表的实现
typedef struct Seqtable {
  int date[MAX];//数据域
  int size;//数据个数
}Seqtable;
//实现函数声明
//初始化函数
void InitSeqtable(Seqtable* st);
//尾插入
void BackSeqtable(Seqtable* st, int data);
//头插入
void FrontSeqtable(Seqtable* st, int data);
//尾删除
void SeqtablePopBack(Seqtable* st);
//头删除
void SeqtablePopFront(Seqtable* st);
//摧毁顺序表
void SeqtableDestory(Seqtable* st);
//打印
void PrintSeqtable(Seqtable* st);
//查找指定元素
//有 返回 下标
//没有 返回 -1
int SearchSeqtable(Seqtable* st);
//更改数据
void ChangeSeqtable(Seqtable* st);

3.Seqtable.c

函数的实现

#define _CRT_SECURE_NO_WARNINGS
#include"Seqtable.h"
//实现方法
//顺序表的,头插尾插,头删尾删
//初始化,和销毁
//静态顺序表
//初始化函数
void InitSeqtable(Seqtable* st) {
  for (int i = 0; i < MAX; i++) {
    st->date[i] = 0;//初始化为0  实际上可以不用初始化数组
  }
  st->size = 0;
}
//尾插入
void BackSeqtable(Seqtable* st, int data) {
  //尾部插入的时候要进行判别是否为满
  if (st->size == MAX) {
    //表示满了
    perror("顺序表已经满员,无法插入新数据\n");
    exit(-1);//退出就可以
  }
  //没有满员,就加入数据即可
  st->date[st->size++] = data;
}
//头插入
void FrontSeqtable(Seqtable* st, int data) {
  //一样先进行判断是否满员
  if (st->size == MAX) {
    perror("满员无法插入");
    exit(-1);
  }
  //头部插入。就是将原有数据向后移动一个位置
  int num = st->size - 1;
  for (int i = num; i>=0; i--) {
    st->date[i + 1] = st->date[i];
  }
  //while (num>=0) {
  //  st->date[num + 1] = st->date[num];
  //  num--;
  //}
  //最后插入数据
  st->date[0] = data;
  st->size++;
}
//尾删除
void SeqtablePopBack(Seqtable* st) {
  //尾删除,需要判断是否为空
  assert(st->size > 0);//断言判断
  st->size--;//直接元素个数减去一个就可以
}
//头删除
void SeqtablePopFront(Seqtable* st) {
  //头部删除,也要判空
  assert(st->size > 0);//断言
  //将后面的数据覆盖前面的数据
  for (int i = 0; i < st->size-1; i++) {
    st->date[i] = st->date[i + 1];
  }
  st->size--;//size减去一个元素即可
}
//摧毁顺序表
void SeqtableDestory(Seqtable* st) {
  //摧毁的话,静态表直接初始化为0
  st->size = 0;
}
//打印
void PrintSeqtable(Seqtable* st) {
  for (int i = 0; i < st->size; i++) {
    printf("%d ", st->date[i]);
  }
}
//查找
int SearchSeqtable(Seqtable* st) {
  assert(st->size > 0);//如果为空,不用查找,直接报错
  int num = 0;
  scanf("%d", &num);//输入查找的元素
  for (int i = 0; i < st->size; i++) {
    if (st->date[i] == num) {
      return i;//找到返回下标
    }
  }
  return -1;//没找到返回-1
}
void ChangeSeqtable(Seqtable* st) {
  int num=SearchSeqtable(st);//进入查找,返回下标
  if (num == -1) {
    printf("顺序表中没有该元素,无法修改\n");
    return;
  }
  int a = 0;
  scanf("%d", &a);//输入想要更改的数据
  st->date[num] = a;
}

2.动态顺序表

所谓动态,就是使用realloc等函数,动态开辟空间,尽量使得顺序表的空间合理化使用

1.test.c

主函数进行测试和使用顺序表

#define _CRT_SECURE_NO_WARNINGS
#include"动态顺序表.h"
void test2() {
  Seqtable st;
  InitSeqtable(&st);//初始化
  //尾插
  BackSeqtable(&st, 1);
  BackSeqtable(&st, 2);
  BackSeqtable(&st, 3);
  BackSeqtable(&st, 4);
  BackSeqtable(&st, 5);
  //打印
  PrintSeqtable(&st);
  printf("\n");
  //头插
  FrontSeqtable(&st, 1);
  FrontSeqtable(&st, 2);
  FrontSeqtable(&st, 3);
  FrontSeqtable(&st, 4);
  FrontSeqtable(&st, 5);
  PrintSeqtable(&st);
  //尾巴删除
  SeqtablePopBack(&st);
  SeqtablePopBack(&st);
  SeqtablePopBack(&st);
  SeqtablePopBack(&st);
  SeqtablePopBack(&st);
  printf("\n");
  //打印
  PrintSeqtable(&st);
  //头删除
  SeqtablePopFront(&st);
  printf("\n");
  //打印
  PrintSeqtable(&st);
  摧毁顺序表
  SeqListDestory(&st);
  //printf("\n");
  打印
  //PrintSeqtable(&st);
}
int main()
{
  test2();
  return 0;
}

2.Seqtable.h

函数声明和结构体创建

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<malloc.h>
//动态顺序表
typedef struct Seqtable {
  int* data;//数据域
  int size;//个数
  int capacity;//容量
}Seqtable;
//实际上动态顺序表和静态顺序表,只有在初始化、销毁、扩容的时候不一样
//实现函数声明
//初始化函数
void InitSeqtable(Seqtable* st);
//尾插入
void BackSeqtable(Seqtable* st, int data);
//头插入
void FrontSeqtable(Seqtable* st, int data);
//尾删除
void SeqtablePopBack(Seqtable* st);
//头删除
void SeqtablePopFront(Seqtable* st);
//摧毁顺序表
void SeqtableDestory(Seqtable* st);
//打印
void PrintSeqtable(Seqtable* st);
//查找
int SearchSeqtable(Seqtable* st);
//更改
void ChangeSeqtable(Seqtable* st);

3.Seqtable.c

代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include"动态顺序表.h"
//动态顺序表
//初始化顺序表
void InitSeqtable(Seqtable* st) {
  st->size = st->capacity = 0;
  st->data = NULL;
}
//扩容
void Expansion(Seqtable* st) {
  //1.直接扩容二倍,这样防止后序一致扩容
  int newcapacity = st->capacity = 0 ? 4 : st->capacity * 2;
  int* tmp = (int*)realloc(st->data, newcapacity * sizeof(int));
  if (tmp == NULL) {
    //表示创建失败
    perror("realloc fail\n");
    exit(-1);
  }
  //创建成功  tmp给data
  st->data = tmp;
  st->capacity = newcapacity;
}
//尾插入
void BackSeqtable(Seqtable* st, int data) {
  //判断是否满员
  if (st->size == st->capacity) {
    //满员进行扩容
    //两个方法
    //1.直接扩容二倍,这样防止后序一致扩容
    Expansion(st);
  }
  //如果没有满员,就正常使用
  st->data[st->size++] = data;
}
//头插入
void FrontSeqtable(Seqtable* st, int data) {
  //使用动态的
  if (st->size == st->capacity) {
    Expansion(st);
  }
  int end = st->size - 1;
  while (end >= 0) {
    st->data[end + 1] = st->data[end];
    --end;
  }
  st->data[0] = data;
  st->size++;
}
//尾删除
void SeqtablePopBack(Seqtable* st) {
  //尾删除,需要判断是否为空
  assert(st->size > 0);//断言判断
  st->size--;//直接元素个数减去一个就可以
}
//头删除
void SeqtablePopFront(Seqtable* st) {
  //头部删除,也要判空
  assert(st->size > 0);//断言
  //将后面的数据覆盖前面的数据
  for (int i = 0; i < st->size - 1; i++) {
    st->data[i] = st->data[i + 1];
  }
  st->size--;//size减去一个元素即可
}
//打印
void PrintSeqtable(Seqtable* st) {
  for (int i = 0; i < st->size; i++) {
    printf("%d ", st->data[i]);
  }
}
//摧毁动态顺序表
//void SeqtableDestory(Seqtable* st) {
//  //先释放空间
//  free(st->data);
//  st->data = NULL;
//  free(st);
//  st->size = st->capacity = 0;
//}
void SeqListDestory(Seqtable* ps) {
  free(ps->data);//直接释放a的空间 
  ps->data = NULL;//然后指向NULL
  ps->capacity = ps->size = 0;
}
//查找
int SearchSeqtable(Seqtable* st) {
  assert(st->size > 0);//如果为空,不用查找,直接报错
  int num = 0;
  scanf("%d", &num);//输入查找的元素
  for (int i = 0; i < st->size; i++) {
    if (st->data[i] == num) {
      return i;//找到返回下标
    }
  }
  return -1;//没找到返回-1
}
void ChangeSeqtable(Seqtable* st) {
  int num = SearchSeqtable(st);//进入查找,返回下标
  if (num == -1) {
    printf("顺序表中没有该元素,无法修改\n");
    return;
  }
  int a = 0;
  scanf("%d", &a);//输入想要更改的数据
  st->data[num] = a;
}

总结

我们本文讲解了,线性表中的顺序表的使用,我们分别实现了静态和动态的顺序表,这是数据结构的基础,我们接下来讲解的内容是线性表中的链表。

好了,行文至此,感谢这一段时间来大家的鼓励和支持,小王会继续努力学习代码的,一起加油啊!!!

相关文章
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
151 4
|
4天前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
26 7
|
4天前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
21 5
|
4天前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
20 5
|
4天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
18 2
|
20天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
53 20
|
18天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
2月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
124 23
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
73 1