打算写一个数据结构系列,将数据结构和算法相关的内容从头到尾整理一遍。如果喜欢这个系列的话,欢迎关注我的个人公众号:“编码魔坊”,回复“数据结构”可免费获取完整代码,查看最新进度哦!!!
一、定义数据类型
下边给出顺序表的静态定义和动态定义两种方式,本案例使用静态定义实现,动态定义实现代码可以去公众号获取。
//定义顺序表中结点存储数据的类型
typedef struct
{
int id; //ID
char name[10]; //姓名
int age; //年龄
}ElemType;
//静态方法定义顺序表的结构
typedef struct
{
ElemType data[MAXSIZE]; //存储数据元素
int length; //顺序表的已存结点个数,即顺序表长度
}SSList; //Static Sequential List
//动态方法定义顺序表的结构
typedef struct
{
ElemType *data;
int length;
}DSList; //Dynamic Sequential List
二、顺序表功能实现
1.初始化顺序表
void SequentialListInit(SSList *list)
{
list->length = 0; //长度为0,表示初始化的顺序表为空
}
2.顺序表中追加数据
- 实现思路
- 1.判断顺序表是否已满,若已满返回OVERFLOW(溢出)
- 2.添加数据节点
- 3.顺序表长度加1
int SequentialListAdd(SSList *list,ElemType element)
{
//判断顺序表是否已满
if(list->length == MAXSIZE)
{
printf("顺序表已满,无法继续添加结点!\n");
return OVERFLOW;
}
//添加数据节点
list->data[list->length] = element;
//顺序表长度加1
list->length++;
//第二步和第三步合并写法
//list->data[list->length++] = element;
return OK;
}
3.输出所有的结点
int SequentialListShow(SSList *list)
{
int i; //循环变量
if(list->length <= 0)
{
printf("顺序表为空!\n");
return ERROR;
}
//输出顺序表的元素
for(i = 0; i < list->length;i++)
{
printf("%d\t%s\t%d\n",list->data[i].id,list->data[i].name,list->data[i].age);
}
return OK;
}
4.指定位置插入结点
- 实现思路
- 1.判断顺序表是否已满
- 2.插入位置是否合法
- 3.插入位置后面的元素依次后移一位
- 4.插入完毕后长度自增1
int SequentialListInsert(SSList *list,int index,ElemType element)
{
int i; //插入数据所需的循环变量
//判断顺序表是否已满
if(list->length == MAXSIZE)
{
printf("顺序表已满,无法继续添加!\n");
return OVERFLOW;
}
//判断下标位置是否合法
//顺序表从0开始,但是人的思维是从1开始
//小于1超出左边下界,大于(list->length - 1)超出右边上界
if(index < 1 || index > (list->length - 1))
{
printf("插入位置错误,无法插入!\n");
return ERROR;
}
//插入结点
//顺序表从0开始,所以最后一个元素的下标为(list->length-1)
for(i = list->length; i >= index; i--)
{
//因为在index处插入,所以index及其后面的所有元素均后移一位
//在顺序表最后一个元素处开始后移一位
list->data[i] = list->data[i-1];
}
list->data[index-1] = element; //在指定位置插入新元素
list->length++; //顺序表的长度加1
return OK; //插入成功
}
5.删除指定位置的数据元素
- 实现思路
- 1.判断删除的下标是否合法
- 2.被删除元素后面所有的数据都要向前移动一位
- 3.删除元素后,顺序表长度减1
int SequentialListDelete(SSList *list,int delIndex)
{
int i; //删除结点时所需的循环变量
//判断下标是否合法
//小于0超出左边下界,大于(list->length-1)超出右边上界
if(delIndex < 0 || delIndex > (list->length - 1))
{
printf("删除位置有误,删除失败!\n");
return ERROR;
}
//被删除数据后面的元素依次向前移动
//顺序表从0开始,用户输入的下标要减1
//i达到顺序表的最大长度则后续元素前移完毕
for(i=delIndex-1;i < list->length;i++)
{
list->data[i] = list->data[i+1];
}
list->length--;
return OK; //删除成功
}
6.根据下标查找数据元素
- 实现思路
- 1.判断查找的位置是否合法
- 2.将查找到的结点的地址保存到element中
int SequentialListSearchByIndex(SSList *list,int index,ElemType *element)
{
//判断查找的位置是否合法
//人类思维下标是1到n,但是顺序表是从0到n,所以查找的下标要减1
//即查找范围为:1到(list->length-1)
if(index < 1 || index > (list->length - 1))
{
printf("查找的下标位置有误!\n");
return ERROR; //查找失败
}
//保存查找到的结点的地址
element->id = list->data[index - 1].id;
strcpy(element->name,list->data[index - 1].name);
element->age = list->data[index - 1].age;
return OK;
}
7.根据用户ID查找结点
int SequentialListSearchById(SSList *list, int id, ElemType *element)
{
int i; //循环变量
for (i = 0; i < list->length; i++)
{
if(id == list->data[i].id)
{
//查找成功,返回查找到的结点及其下标
element->id = list->data[i].id;
strcpy(element->name,list->data[i].name);
element->age = list->data[i].age;
return (i + 1);
}
}
return FALSE; //未查找到
}
8.不主要的函数
/**
* @brief 获取顺序表的长度
*/
int GetSequentialListLength(SSList *list)
{
return (list->length);
}
/**
* @brief 清空顺序表
*/
int SequentialListClear(SSList *list)
{
if(list->length == 0)
{
printf("顺序表为空,无需清空!\n");
return ERROR;
}
//顺序表不为空,清空顺序表
list->length = 0;
}
/**
* @brief 判断顺序表是否为空
*/
int SequentialListIsEmpty(SSList *list)
{
if(list->length == 0)
{
return TRUE; //是空表
}
return FALSE; //不是空表
}
完整代码可以关注公众号:“编码魔坊”,回复:“数据结构”就可以免费获取了!!!