一、表的定义
我们常说的表一般是指线性表,线性表可以分为两类:一是基于简单数组实现的顺序表;二是链表。今天先简单说一下最简单的顺序表的静态实现。
二、静态顺序表的实现步骤
1、预处理(对需要用到的先进行类型定义和声明)
//预处理
//【1】声明静态顺序表的最大长度
#define MaxSize 10
//【2】自定义C语言中的bool变量,或者直接包含头文件include <>
#define bool char
#define true 1
#define false 0
//【3】自定义数据元素的数据类型
typedef int Elemtype;
//【4】静态顺序表的结构体定义
typedef struct SqList
{
Elemtype date[MaxSize];//用静态数组存放数据,开辟了一块大小为MaxSize大小的内存空间
int length;//顺序表的当前长度
}SqList;
对于这一部分,第二步【2】的bool变量类型也可以直接通过包含#include <stdbool.h>来实现;
2、创建一个顺序表,并对表进行初始化
为了方便阅读,先将主函数的部分写上
int main()
{
SqList L1;//表示向内存申请一块空间生成静态顺序表,名字叫做L1
InitialSqList(&L1);//初始化顺序表,
return 0;
}
先声明一个类型为SqList的变量L1;L1就是我们要的顺序表,对表L1进行初始化:
bool InitialSqList(SqList* L)
{
L->length = 0;//初始化表长
for (int i = 0; i < MaxSize; i++)//遍历整个顺序表,清除表中的脏数据
{
L->date[i] = 0;
}
return true;//初始化成功,返回true
}
对于初始化,里面的对数据初始化这一步可以省略,因为我们在访问这个表时,只是访问到当前表长的位置。因此表长初始化不能省略。到这一步,我们对于创建一个静态顺序表的程序基本实现。接下来就是对表进行输出打印。
3、顺序表的输出
bool SqListPrintf(SqList L)
{
//<1>判空
if (L.length == 0)
{
printf("这是一个空表!\n");
return false;
}
printf("SqList:\n");//如果不是一个空表,则输出表中的元素
for (int i = 0; i < L.length; i++)
{
printf("%d-->", L.date[i]);
}
printf("end\n");
return true;
}
输出顺序表首先判断当前表长是否为0;为0则是空表,否则输出表中的元素。
三、表ADT
什么是表ADT?简单来说,就是对表中数据元素进行的一些操作的集合,例如:增、删、改、查。1、顺序表的基本操作——增
增:即是添加元素
//在顺序表的第i位的位置插入一个元素e
bool SqListInsert(SqList* L, int i, Elemtype e)
{
//(1)判断插入位置是否合法
if (i<1 || i>L->length + 1)
{
printf("插入位置不合法!\n");
return false;
}
if (L->length >= MaxSize)
{
printf("表已满!\n");
return false;
}
//(2)移动元素,空出待插入的位置
for (int j = L->length; j >=i; j--)
{
L->date[j] = L->date[j - 1];
}
//(3)将新元素插入到正确位置
L->date[i - 1] = e;
//(4)表长加一
L->length++;
return true;//返回true,表示插入成功
}
插入元素需要的一些步骤代码里有详细注释,可自行阅读
2、顺序表的基本操作——删
在顺序表的第i位的位置删除一个元素e,并且返回元素e
bool SqListElemDelete(SqList* L, int i, Elemtype* e)
{
//(1)判断删除位置是否合法
if (i<1 || i>L->length + 1)
{
printf("删除位置不合法!\n");
return false;
}
if (L->length <=0 )//表中已经没有元素
{
printf("表已空!\n");
return false;
}
//(2)将待删除的元素赋值给e
*e = L->date[i - 1];
//(3)将第i位以后的元素前移
for (int j = i; j < L->length; j++)
{
L->date[j - 1] = L->date[j];
}
//(4)表长减一
L->length--;
return true;//表示删除成功
}
3、表的基本操作——查(按值查找)
对于改就不写了,先查查到元素,再将要修改的元素进行重修赋值即可
查找顺序表中元素e的位置,并返回该元素在顺序表的为位序
int SqListElemFind(SqList L, Elemtype e)
{
for (int i = 0; i < L.length; i++)
{
if (e == L.date[i])
return i + 1;
}
return 0;
}
最后是完整的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//预处理
//【1】声明静态顺序表的最大长度
#define MaxSize 10
//【2】自定义C语言中的bool变量,或者直接包含头文件include <>
#define bool char
#define true 1
#define false 0
//【3】自定义数据元素的数据类型
typedef int Elemtype;
//【4】静态顺序表的结构体定义
typedef struct SqList
{
Elemtype date[MaxSize];//用静态数组存放数据,开辟了一块大小为MaxSize大小的内存空间
int length;//顺序表的当前长度
}SqList;
//【5】顺序表的初始化
bool InitialSqList(SqList* L)
{
L->length = 0;//初始化表长
for (int i = 0; i < MaxSize; i++)//遍历整个顺序表,清除表中的脏数据
{
L->date[i] = 0;
}
return true;//初始化成功,返回true
}
//顺序表的输出
bool SqListPrintf(SqList L)
{
//<1>判空
if (L.length == 0)
{
printf("这是一个空表!\n");
return false;
}
printf("SqList:\n");//如果不是一个空表,则输出表中的元素
for (int i = 0; i < L.length; i++)
{
printf("%d-->", L.date[i]);
}
printf("end\n");
return true;
}
//顺序表的基本操作
//【6】顺序表的插入(按位插入)
//在顺序表的第i位的位置插入一个元素e
bool SqListInsert(SqList* L, int i, Elemtype e)
{
//(1)判断插入位置是否合法
if (i<1 || i>L->length + 1)
{
printf("插入位置不合法!\n");
return false;
}
if (L->length >= MaxSize)
{
printf("表已满!\n");
return false;
}
//(2)移动元素,空出待插入的位置
for (int j = L->length; j >=i; j--)
{
L->date[j] = L->date[j - 1];
}
//(3)将新元素插入到正确位置
L->date[i - 1] = e;
//(4)表长加一
L->length++;
return true;//返回true,表示插入成功
}
//【7】顺序表的删除(按位删除)
//在顺序表的第i位的位置删除一个元素e,并且返回元素e
bool SqListElemDelete(SqList* L, int i, Elemtype* e)
{
//(1)判断删除位置是否合法
if (i<1 || i>L->length + 1)
{
printf("删除位置不合法!\n");
return false;
}
if (L->length <=0 )//表中已经没有元素
{
printf("表已空!\n");
return false;
}
//(2)将待删除的元素赋值给e
*e = L->date[i - 1];
//(3)将第i位以后的元素前移
for (int j = i; j < L->length; j++)
{
L->date[j - 1] = L->date[j];
}
//(4)表长减一
L->length--;
return true;//表示删除成功
}
//【8】顺序表的查找(按值删除)
//查找顺序表中元素e的位置,并返回该元素在顺序表的为位序
int SqListElemFind(SqList L, Elemtype e)
{
for (int i = 0; i < L.length; i++)
{
if (e == L.date[i])
return i + 1;
}
return 0;
}
int main()
{
SqList L1;//表示向内存申请一块空间生成静态顺序表,名字叫做L1
InitialSqList(&L1);//初始化顺序表,
for (int i = 1; i < 5; i++)
{
SqListInsert(&L1, i, i * i);
}
SqListInsert(&L1, 3, 20);//插入元素
//int e;
//SqListElemDelete(&L1, 1, &e);
SqListElemFind(L1, 20);//查找元素
SqListPrintf(L1);
//printf("被删除的元素是:%d", e);
printf("该元素在顺序表中的位序是:%d", SqListElemFind(L1, 20));
return 0;
}