王道数据结构实践代码----动静态顺序表的实现(C语言版)
前言
日期:2021年10月14日
书籍:王道2021年数据结构考研复习指导
代码内容:实现顺序表的基本实现,包括初始化,插入新元素,删除新元素,输出,查询
代码展示
1. 预编译内容
//[1]定义顺序表最大长度和动态数组初始默认的最大容量
#define MaxSize 10 //静态顺序表的最大长度
#define InitSize 10 //动态顺序表的初始最大长度
//需要包含的头文件
#include <stdio.h>
#include <stdlib.h>
//C语言自定义bool变量
#define bool char
#define true 1
#define false 0
//自定义数据元素的数据类型
typedef int Elemtype;
2. 结构体编写
//顺序表数据元素结构体(静态分配)
typedef struct SqList
{
//[1]用静态的“数组”存放数据元素
Elemtype data[MaxSize];
//[2]顺序表的当前长度
int length;
}SqList;//顺序表的类型定义(静态分配方式)
//顺序表数据元素结构体(动态分配)
typedef struct SeqList
{
//[1]指示动态分配数组的指针
Elemtype *data;
//[2]顺序表的当前长度
int length;
//[3]顺序表的最大容量
int maxsize;
}SeqList;//顺序表的类型定义(动态分配方式)
3. 初始化
//基本操作----初始化一个静态顺序表
bool InitsqList(SqList *L)
{
//[1]将所有数据元素设为默认初始值
for(int i = 0; i < MaxSize; i++)
{
L->data[i] = 0;
}
/*
1.本步骤其实可以省略
2.之所以赋初值是因为内存中会有遗留的"脏数据"
3.但是常规操作下,用户无法访问大于
当前表长的数据元素,所以可以在需要时再赋值
*/
//[2]顺序表初始长度设为0
L->length = 0;
return true;
}
//基本操作----初始化一个动态顺序表
bool InitseqList(SeqList *L)
{
//[1]用malloc函数申请一片连续的存储空间
L->data = (Elemtype *)malloc(sizeof(Elemtype) * InitSize);
//[2]表长和默认最大长度初始化
L->length = 0;
L->maxsize = InitSize;
return true;
}
4. 动态顺序表的加长
//动态顺序表的加长
bool IncreaseSize(SeqList *L,int len)
{
//[1]生成指向原来顺序表存储位置的指针
int *p = L->data;
//[2]为顺序表开辟一片比原来更大的空间
L->data = (Elemtype *)malloc((L->maxsize + len) * sizeof(Elemtype));
//[3]转移数据
for (int i = 0; i < L->length; i++)
{
L->data[i] = p[i];
}
//[4]修改顺序表的最大长度,为其增加len
L->maxsize = L->maxsize + len;
//[5]释放原来的存储空间
free(p);
return true;
}
5. 顺序表的插入
//基本操作----顺序表的插入
//[1]静态顺序表的插入
bool SqListInsert(SqList *L,int i,Elemtype e)
{
//[1]判断i的合法性
if(i < 1 || i > L->length + 1)
{
printf("The position of the element to be inserted is invalid!\n");
return false;
}
if(L->length >= MaxSize)
{
printf("This sequence table is full!\n");
return false;
}
//[2]将第i个元素及之后的元素都后移
for(int j = L->length; j >= i; j--)
{
L->data[j] = L->data[j-1]; //第i个元素对应数组下标为i-1的数组元素
}
//[3]在正确的位置插入新元素
L->data[i-1] = e;
//[4]顺序表长+1(注意:顺序表的最大长度不变)
L->length++;
//[5]插入成功,返回成功信号
return true;
}
//[2]动态顺序表的插入
bool SeqListInsert(SeqList *L,int i,Elemtype e)
{
//[1]判断i的合法性
if(i < 1 || i > L->length + 1)
{
printf("The position of the element to be inserted i