前言
数据结构是学习计算机或者其它计算机相关专业的核心课程,我所在的高校使用的教材是清华大学的严蔚敏教授所编写数据结构教材。这本书以我目前的水平来讲是没有资格去评价它的。但是有一点不得不说的是,这本数里面的代码好多都是类c代码的伪代码来演示。这使得好多学习者在学习的时候无法编写可以运行的程序去实验。造成了很多学习上的不便。这里我给出一些代码来和大家一起分析和学习数据结构这门课。
提到数据结构,那就不得不先说一下。最基本的数据结构—线性表。在大多数的数据结构书中,最先介绍的也是这个。而线性表有两种最基本的存储结构。一种是顺序存储结构,一种是链式存储结构。今天就来和大家一起来讨论顺序存储结构。
所谓顺序存储结构指的是用一组地址连续的存储单元依次存储表中的元素。无须为表示表中元素间的逻辑关系而额外增加存储空间(相比较于链式存储结构需要指针来存储下一个元素的位置,后面会提到),并且可以实现随机存取的一种数据结构。
以下是顺序表的实现中所需的头文件和结构的定义:
#include
#include
#include
#define INIT_SIZE 100
//定义顺序表中使用的数据类型为int型
typedef int dataType;
//定义顺序表中的结构
typedef struct {
dataType *data; //存放数据表中的数据
int size; //存放数据表的大小
int maxSize; //存放数据表当前可容纳的数据量
}SqList;
讨论一种存储结构,不单单要考虑它的结构定义,还要考虑它经常使用的一些操作。如增删改查等等。以下来实现顺序表的一些基本操作:
//初始化顺序表
//传入参数为该顺序表结构体类型的指针
void InitList(SqList *l) {
//为顺序表中存放数据的部分分配空间
l->data = (dataType*)malloc(INIT_SIZE * sizeof(dataType));
//初始化顺序表的长度
l->size = 0;
//初始化顺序表的最大长度
l->maxSize = INIT_SIZE;
}
//在顺序表l中的第k个位置插入元素x
//传入参数为顺序表的指针,要插入元素的位置,要插入元素的值
void Insert(SqList *l, int k, dataType x) {
//如果要插入元素的位置小于1,或者大于表的长度就退出
if (k<1 || k>l->size + 1)
exit(1);
//如果表的长度已经到达最大值就退出
if (l->size == l->maxSize)
exit(1);
//让i的值等于表的长度,然后向后依次挪动一个位置直到k停止
for (int i = l->size; i >= k; i--) {
l->data[i] = l->data[i - 1];
}
//将x的值插入到k所在的位置,并且使表长加1
l->data[k - 1] = x;
l->size++;
}
//删除顺序表的第k个元素
//传入的参数为顺序表的指针,和删除的位置
void Delete(SqList *l, int k) {
//如果删除的位置小于1或者大于表长则退出
if (k < 1 || k > l->size)
exit(1);
//从删除的位置开始每一个元素等于他后面的元素
for (int i = k; i < l->size; i++) {
l->data[i - 1] = l->data[i];
}
//表长减1
l->size--;
}
//判断顺序表是否为空
int empty(SqList *l) {
//传入顺序表,判断当前表长是否为0
return l->size == 0;
}
//判断顺序表是否满
int full(SqList *l) {
//传入顺序表,判断当前表长是否为表的最大值
return l->size == l->maxSize;
}
//求顺序表中第i个元素的值
//传入顺序表和元素的位置
dataType GetData(SqList *l, int i) {
//检查传入的位置是否合理
if (i < 1 || i>l->size)
exit(1);
//返回i所在位置的元素值
return l->data[i - 1];
}
//在顺序表中查找值为x的元素
//传入顺序表和要查找的元素
int locate(SqList *l, dataType x) {
//遍历顺序表,如果和传入的x值相同则返回下标加1
for (int i = 0; i < l->size; i++) {
if (l->data[i] == x) {
return i + 1;
}
return 0;
}
}
//输出顺序表
void Print(SqList *l) {
//遍历顺序表,并输出
for (int i = 0; i < l->size; i++) {
printf("%d ", l->data[i]);
}
printf("\n");
}
int main() {
//定义一个顺序表的变量,再定义一个该类型的指针指向那个变量
SqList list;
SqList *pList = &list;
//初始化顺序表
InitList(pList);
//在第一个位置上插入10。此时表中元素为 10
Insert(pList, 1, 10);
//在第一个位置上插入20。此时表中元素为 20 10
Insert(pList, 1, 20);
//删除第二个元素。此时表中元素为 20
Delete(pList, 2);
//在第一个位置上插入30。此时表中元素为 30 20
Insert(pList, 1, 30);
//在第一个位置上插入40。此时表中元素为 40 30 20
Insert(pList, 1, 40);
//输出顺序表
Print(pList);
//输出表中第二个元素
printf("%d\n", GetData(pList,2));
system("pause");
return 0;
}
以上就是顺序表结构和一些基本操作的实现,希望这篇博客可以帮到大家。有什么疑问或者指教可以评论或者发送邮件到我的邮箱。
我的邮箱是[email protected]