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

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

五、完整代码演示

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

总结

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

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

相关文章
|
8天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
34 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
11天前
|
存储 编译器 C语言
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
43 2
|
4天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
17 4
|
5天前
|
存储
数据结构(顺序表)
数据结构(顺序表)
11 0
|
6天前
|
存储 算法
【数据结构】新篇章 -- 顺序表
【数据结构】新篇章 -- 顺序表
6 0
|
11天前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
11天前
|
存储 测试技术
探索数据结构:顺序表的实现与应用
探索数据结构:顺序表的实现与应用
|
11天前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
13 0
|
11天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
16 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
11天前
初步认识栈和队列
初步认识栈和队列
36 10