一、顺序表的相关练习
1.顺序表的创建与释放和增删改查
1>seqlist.h
#ifndef SEQLIST_H //防止头文件被重复调用展开
#define SEQLIST_H
#include <myhead.h>
#define MAX 100 //顺序表最大长度
typedef int datetype; //顺序表元素数据类型重定义
//定义数据表并进行数据类型重定义
typedef struct
{
datetype date[MAX]; //存放顺序表数据元素的数组
int len; //顺序表当前长度
}Seqlist, *SeqlistPtr; //类型重定义名称
//顺序表各种操作函数声明
//创建顺序表
SeqlistPtr seqlistCreate();
//顺序表判空
int seqlistEmpty(SeqlistPtr L);
//顺序表判满
int seqlistFull(SeqlistPtr L);
//添加元素
int seqlistAdd(SeqlistPtr L, datetype e);
//遍历打印
int seqlistPrint(SeqlistPtr L);
//按位置插入
int seqlistInserPos(SeqlistPtr L, int pos, datetype e);
//任意位置删除
int seqlistDeletePos(SeqlistPtr L, int pos);
//按值查找
int seqlistSearchValue(SeqlistPtr L, datetype e);
//按位置修改
int seqlistUpdatePos(SeqlistPtr L, int pos, datetype e);
//按值修改
int seqlistUpdateValue(SeqlistPtr L, datetype old_e, datetype new_e);
//顺序表释放
int seqlistFree(SeqlistPtr *L);
#endif
2>seqlist.c
#include "seqlist.h"
//顺序表各种操作函数定义
//创建顺序表
SeqlistPtr seqlistCreate()
{
SeqlistPtr L = (SeqlistPtr)malloc(sizeof(Seqlist)); //创建顺序表"L",并在堆区申请相应空间
//判断是否创建成功
if( L == NULL)
{
printf("创建失败\n\n");
return NULL;
}
//顺序表初始化
memset(L->date, 0, sizeof(L->date));
L->len = 0; //初始化长度为0
printf("创建成功\n\n");
return L;
}
//顺序表判空
int seqlistEmpty(SeqlistPtr L)
{
//判断逻辑:顺序表长度==0则空
return L->len == 0;
}
//顺序表判满
int seqlistFull(SeqlistPtr L)
{
//判断逻辑:顺序表长度==MAX则满
return L->len == MAX;
}
//添加元素
int seqlistAdd(SeqlistPtr L, datetype e)
{
//判断合法性和是否已满
if(L==NULL || seqlistFull(L))
{
printf("元素添加失败\n\n");
return -1;
}
//向len位中添加元素
L->date[L->len] = e;
L->len++; //表长度+1
printf("元素添加成功\n\n");
return 0;
}
//遍历打印
int seqlistPrint(SeqlistPtr L)
{
//判断合法性和是否为空
if(L==NULL || seqlistEmpty(L))
{
printf("元素打印失败\n\n");
return -1;
}
//遍历打印,首位-->len-1位
for(int i=0; i<L->len; i++)
{
printf("%d\t", L->date[i]);
}
putchar(10);
printf("元素打印完成\n\n");
return 0;
}
//按位置插入
int seqlistInserPos(SeqlistPtr L, int pos, datetype e)
{
//判断合法性和是否还有余位插入
if(L==NULL || seqlistFull(L) || pos<0 || pos>L->len)
{
printf("元素插入失败\n\n");
return -1;
}
//插入位至末位整体向后偏移一位
for(int i=L->len-1; i>=pos; i--)
{
L->date[i+1] = L->date[i];
}
//将元素插入pos位
L->date[pos] = e;
L->len++; //插入完成,长度+1
printf("元素插入成功\n\n");
return 0;
}
//任意位置删除
int seqlistDeletePos(SeqlistPtr L, int pos)
{
//判断合法性和是否可删除元素
if(L==NULL || seqlistEmpty(L) || pos<0 || pos>=L->len)
{
printf("元素删除失败\n\n");
return -1;
}
//将pos+1位至末位整体向前偏移1位
for(int i=pos; i<L->len; i++)
{
L->date[i] = L->date[i+1];
}
L->len--; //删除完成,长度-1
printf("元素删除成功\n\n");
return 0;
}
//按值查找
int seqlistSearchValue(SeqlistPtr L, datetype e)
{
//判断合法性和是否为空
if(L==NULL || seqlistEmpty(L))
{
printf("元素查找失败\n\n");
return -1;
}
//遍历查找相同值
for(int i=0; i<L->len; i++)
{
if(L->date[i] == e)
{
printf("元素查找成功\n\n");
return i; //查找成功,返回查找值下标
}
}
printf("查找不到元素\n\n");
return -1;
}
//按位置修改
int seqlistUpdatePos(SeqlistPtr L, int pos, datetype e)
{
//判断合法性和是否为空
if(L==NULL || seqlistEmpty(L) || pos<0 || pos>=L->len)
{
printf("元素修改失败\n\n");
return -1;
}
//直接在pos位修改元素
L->date[pos] = e;
printf("元素修改成功\n\n");
return 0;
}
//按值修改
int seqlistUpdateValue(SeqlistPtr L, datetype old_e, datetype new_e)
{
//判断合法性和是否为空
if(L==NULL || seqlistEmpty(L))
{
printf("元素修改失败\n\n");
return -1;
}
//调用查找函数找值
int res = seqlistSearchValue(L, old_e);
//查找成功,直接在res位插入新值
if(res != -1)
{
seqlistUpdatePos(L, res, new_e);
printf("元素修改成功\n\n");
return 0;
}
printf("查找不到元素\n\n");
return -1;
}
//顺序表释放
int seqlistFree(SeqlistPtr *L)
{
//判断合法性
if(*L == NULL)
{
printf("释放失败\n\n");
return -1;
}
free(*L);
*L = NULL;
printf("释放成功\n\n");
return 0;
}
3>main.c
#include "seqlist.h"
int main(int argc, const char *argv[])
{
//创建顺序表
SeqlistPtr L = seqlistCreate();
//添加元素
seqlistAdd(L, 520);
seqlistAdd(L, 1314);
seqlistAdd(L, 100);
seqlistAdd(L, 2014);
//打印
seqlistPrint(L);
//插入元素
seqlistInserPos(L, 3, 2013);
//打印
seqlistPrint(L);
//删除元素
seqlistDeletePos(L, 2);
//打印
seqlistPrint(L);
//按值查找
seqlistSearchValue(L, 2013);
//按位置修改
seqlistUpdatePos(L, 3, 3344);
//打印
seqlistPrint(L);
//按值修改
seqlistUpdateValue(L, 3344 ,2014);
//打印
seqlistPrint(L);
//释放顺序表
seqlistFree(&L);
//打印测试是否释放成功
seqlistPrint(L);
return 0;
}
4>程序运行效果截图
![](https://i-blog.csdnimg.cn/direct/50a2cd6479b74671b45c299af8f9a6be.png)
二、数据结构相关知识思维导图
1.数据![](https://i-blog.csdnimg.cn/direct/f226a8fbee7f498381eb3124c5d75ffc.png)
2.结构![](https://i-blog.csdnimg.cn/direct/6cf0f70a9ec048d09eb44207441433e2.png)
3.线性表![](https://i-blog.csdnimg.cn/direct/3a2d52e555404d64891c3af9e4374dfe.png)
4.顺序表![](https://i-blog.csdnimg.cn/direct/4baa10e959744d32819d4628d6334748.png)