目录

前言

一、顺序表是什么?

二、顺序表的实现

1.顺序表存储结构

2.接口

总结


前言

阅前提醒:本篇只是写出了顺序表里主要的算法代码,并没有以某种具体系统为轮廓来进行介绍。但是我想信,只要你掌握了这些主要的算法,你就能够拥有写出类似于“图书管理系统”此类系统的能力。(阅读前请先深呼吸,静下心来阅读哟,不管文章的质量如何,在当今碎片化信息泛滥的年代,能够静下心来也是一种能力!!!)

..........................................................小白上路,不喜勿喷................................................................

一、顺序表是什么?

顺序表其实是线性表的线性表示,线性表是数据结构里众多中的一种,当然链表也是线性表,关于链表(下方链接)

数据结构—单链表、双向循环链表的实现【C语言】_虾料的博客-CSDN博客https://blog.csdn.net/Che__dan/article/details/125921322?spm=1001.2014.3001.5501

顺序表:是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。


二、顺序表的实现

1.顺序表存储结构

在实现之前,我们需要写出顺序表的存储结构,而它的存储有静态存储与动态存储。

  • 静态存储:
//静态顺序表
#define N 200
typedef int SLDataType;
typedef struct SeqList
{SLDataType data[N];int len;//数据个数
}SL;

这里顺序表的大小就是“200*int”,但是静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表。

  • 动态存储:
//动态顺序表
typedef int SLDataType;//每个数据的数据类型
typedef struct SeqList
{SLDataType* data;//指向动态数组指针int len;//数据个数int capacity;//容量
}SL;

注意:这里“int capacity”的值在大部分时间下都不会与“len”的值相等,这里开辟空间是多个内存一次性地开辟,当“capacity==len”时,就代表顺序表空间满了。

当然,这顺序表的每个数据的数据类型也是可以改变的。这里定义的是“int”类型(“typedef int SLDataType”),你自己也可以定义一个结构体,替换“int”,那么每个数据的类型就是你定义的那个结构体。


2.接口

我们需要实现的接口:

// 顺序表初始化
void SeqListInit(SeqList* psl);// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl);// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);// 顺序表尾删
void SeqListPopBack(SeqList* psl);// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x);// 顺序表头删
void SeqListPopFront(SeqList* psl);// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x);// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos);//修改pos位置的数据
void SLModify(SL* ps, int pos, SLDataType x);// 顺序表打印
void SeqListPrint(SeqList* psl);// 顺序表销毁
void SeqListDestory(SeqList* psl);

...........................................................................................................................................................

提示:上述接口的代码是写在同一个源文件中,如“SeqList.c”,我会将其拆分,对关键部分进行详讲。

  • 顺序表初始化:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//初始化
void SeqListInit(SL* ps)
{assert(ps);ps->data =NULL;ps->capacity = 0;ps->len = 0;
}

这里assert的作用就是判断进入函数的指针是否为空指针,如果是空指针就结束当前程序运行。(此函数的头文件是“assert.h”)

“assert(x)”  x为真,就能通过。

  • 检查空间,如果满了,进行增容:
//检查、增加容量
void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->len == ps->capacity){int newCapacity = (ps->capacity == 0) ? 4 : ps->capacity * 2;//开辟多少空间。SLDataType* tmp = (SLDataType*)realloc(ps->data, newCapacity * sizeof(SLDataType));if (tmp == NULL)//确保reallc函数开辟内存成功。{printf("realloc fail\n");exit(-1);}ps->data = tmp;ps->capacity = newCapacity;}
}

“realloc”与“exit”函数头文件都是“stdlib.h”;

“realloc”函数就是动态内存开辟函数。(大佬的详解->【C语言】realloc函数_SouLinya的博客-CSDN博客_realloc)

“exit”函数的功能是关闭所有文件,终止正在执行的进程。有“exit(x)”,只要x不为0,都表示异常退出。(大佬的详解->C语言中的exit()函数_春卷同学的博客-CSDN博客_c语言exit函数用法)

  • 顺序表尾插:
//尾插
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);//检查、增加容量ps->data[ps->len] = x;ps->len++;
}

只要是涉及到插入数据就得调用“SLCheckCapacity()”函数检查顺序表的内存剩余情况。(下同)

  • 顺序表尾删:
//尾删
void SLPopBack(SL* ps)
{assert(ps);assert(ps->len > 0);ps->len--;
}

删除只需要移动下标,并不需要太复杂的操作。

  • 顺序表头插:
//头插
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);int end = ps->len - 1;//确保不对len进行修改while (end>=0){ps->data[end + 1] = ps->data[end];--end;}ps->data[0] = x;ps->len++;}
  • 顺序表头删:
//头删
void SLPopFront(SL* ps)
{assert(ps);assert(ps->len > 0);int begin = 1;while (begin<ps->len){ps->data[begin-1] = ps->data[begin];begin++;}ps->len--;
}
  • 顺序表查找:
//查找
int SLFind(SL* ps, SLDataType x)
{assert(ps);for (int i=0;i<ps->len;i++){if (ps->data[i]==x){return i;}}return -1;
}

这里返回的是下标,如果返回值为-1,表示查找失败。

  • 顺序表在pos位置插入x:
//插入(可以用于头插、尾插)
void SLInsert(SL* ps, int pos, SLDataType x)
{SLCheckCapacity(ps);assert(ps);assert(pos>=0 && pos<=ps->len);int end = ps->len - 1;while (pos<=end){ps->data[end+1] = ps->data[end];end--;}ps->data[pos] = x;ps->len++;
}
  • 顺序表删除pos位置的值:
//删除(可以用于头删、尾删)
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos>0 && pos<ps->len);int begin = pos;while (begin<ps->len-1){ps->data[begin] = ps->data[begin + 1];begin++;}ps->len--;
}
  • 顺序表打印:
//打印
void SLprintf(SL* ps)
{assert(ps);for (int i=0;i<ps->len;i++){printf("%d ",ps->data[i]);}printf("\n");
}
  • 修改pos位置的数据:
//修改
void SLModify(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos>0 && pos<ps->len);ps->data[pos] = x;
}
  • 顺序表销毁:
//顺序表销毁
void SLDestory(SL* ps)
{assert(ps);if (ps->data){free(ps->data);ps->data = NULL;ps->capacity = ps->len = 0;}
}

凡是动态开辟的空间最后都需要用free进行销毁。


总结

顺序表存储结构:静态存储、动态存储。

顺序表的接口:

  • 顺序表初始化
  • 检查空间,如果满了,进行增容
  • 顺序表尾插
  • 顺序表尾删
  • 顺序表头插
  • 顺序表头删
  • 顺序表查找
  • 顺序表在pos位置插入x
  • 顺序表删除pos位置的值
  • 修改pos位置的数据
  • 顺序表打印
  • 顺序表销毁

以上这些你会了吗,你可能会说:“现在理解了、记住了,但过了一段时间就忘了”。没关系,这很正常,知识就是要不断地巩固,才能克服艾宾浩斯遗忘曲线,加油!!!(记得点点关注哦)

数据结构—顺序表的实现【C语言】相关推荐

  1. 数据结构-顺序表基本操作(C语言实现)

    参考书:王道考研数据结构 //函数的声明 SqList InitList(l);                                    //初始化一个顺序表 void PrintfLi ...

  2. 顺序表倒置java_数据结构-顺序表 java实现-Go语言中文社区

    知识点 线性表的顺序结构存储结构简称为顺序表. 线性表逻辑顺序相邻,顺序表存储位置相邻. 便于随机存取. 删除和插入可能要移动大量元素,效率低. 解决溢出的方法是新建另一个大容量数组,效率低. 实现 ...

  3. C语言链表的转置算法,c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置.doc...

    c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置 #include "stdio.h" #include "malloc.h" /*typedef s ...

  4. C语言/C++常见习题问答集锦[八十三]之数据结构顺序表(operand types are error: no match for “operator==“)

    C语言/C++常见习题问答集锦[八十三]之数据结构顺序表{operand types are error: no match for "operator=="} 程序之美 前言 主 ...

  5. 数据结构-顺序表(动态分配存储空间)

    数据结构-顺序表(动态分配存储空间) (1)顺序表的结构定义: 结构型定义:(动态分配存储空间) /*** 动态分配存储空间*/ #define InitSize 100 //动态分配存储空间时,不限 ...

  6. 数据结构--顺序表的使用

    数据结构--顺序表的使 #include<iostream> #include<cstdio> #include<cstring> using namespace ...

  7. Educoder头歌数据结构顺序表及其应用

    头歌实践平台答案educoder 数据结构-顺序表及其应用 第1关:顺序表的实现之查找功能 /***************************************************** ...

  8. 数据结构——顺序表的合并

    数据结构--顺序表的合并 具体要求:写一个函数,其函数的功能是将非递增顺序表LA和LB合并到非递增顺序表LC中 数据结构-顺序表的操作之合并顺序表 一.顺序表的结构 首先要定义的是顺序表的结构体,只有 ...

  9. 顺序表输入栈元素c语言,C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...

  10. 图书信息管理系统(数据结构顺序表,c语言版)

    图书信息管理系统 顺序表 一.实验题目 二.工具环境 三.实验问题 问题: 四.实验代码 五.解决方法 方法: 一.实验题目 图书信息管理系统 出版社有一些图书数据,为简单起见,在此假设每种图书只包括 ...

最新文章

  1. Btrfs入门(一)
  2. 民政部部长李纪恒:适龄人口生育意愿偏低,总和生育率破警戒线
  3. 域迁移(降级)注意事项
  4. “烘焙”ImageNet:自蒸馏下的知识整合
  5. dotproject 文件下载错误
  6. 怎样添加、移除、移动、复制、创建和查找节点?
  7. NUC972配置为支持NFS
  8. Linux 进程 | 进程间的通信方式
  9. 字段的某记录相同,但是时间不同,找到MySQL里面最新的数据
  10. 镜像的查看,获取,推送和构建
  11. PHP+Ajax点击加载更多内容 -这个效果好,速度快,只能点击更多加载,不能滚动自动加载...
  12. 论坛模块_实现功能2_实现显示版块列表与显示单个版块的功能
  13. 如何批量删除 Word 中的页眉页脚、图片、超链接等内容?
  14. 《大数据时代》读后感,维克托
  15. C#实现多人语音聊天
  16. excel清单数据导入到开票软件中进行开票
  17. 用matlab判断两个球是否相交,判断两个矩阵相交
  18. Windows注册表的基本知识及应用
  19. 【C语言 赋值抑制符 *】
  20. 用MPAndoidChart展示搜索到的GPS及卫星信息

热门文章

  1. React中pros和state的区别
  2. 【网络攻防原理与技术】第5章:拒绝服务攻击
  3. JVM内存溢出的几种方式与解决方法
  4. 小米23届校招薪资开奖!算法岗最高 50w
  5. 50w年薪,够诱人的
  6. 巧用Word通配符为英中双语字幕文件中的简体中文制作一份副本
  7. 【机器学习】深度学习的三个概念:Epoch, Batch, Iteration
  8. Codeforce #541(Div.2) C. Birthday (思维、暴力)
  9. 有一种70年的情缘,叫中国科学院和海淀!
  10. 用java实现职工排序题