前言
为什么要学习数据结构?学习数据结构是为了更简洁、更高效的编程。数据结构研究的的数据的逻辑结构、存储结构及其操作。逻辑结构是数据元素与数据元素之间的关系。常用的存储结构有顺序存储、链式存储、索引存储和哈希存储等。操作包含创建、插入、显示、删除、修改以及查找。
什么是线性表?
线性表是最基本、最简单、最常用的一种数据结构。线性表中数据元素在逻辑上具有“一对一”的关系,即除了第一个和最后一个数据元素外,其他的数据元素都是首尾相接的(注意:这句话适用大部分线性表,而不是全部。比如,循环链表)。
什么是顺序表?
在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构。它的特点是大小固定,有顺序且连续存储,访问方便,表满不能存储,表空不能取出,但是删除和插入不方便。
顺序表的基本操作
1.顺序表的结构定义
//数据元素类型
typedef int data_type;
//顺序表的数据类型
//假设定义存储5个元素
#define N 5
typedef struct list
{
data_type arr[N];
int count;
}
2.创建一个顺序表
List *creatList(void)
{
//先定义一个结构体指针,用来接收返回值
List *pList = NULL;
pList = (List *)malloc(sizeof(List));
if(NULL == pList)
{
printf("malloc error!\n");
return NULL;
}
memset(pList,0,sizeof(List));
return pList;
}
3.向顺序表中插入元素
步骤:1.判断顺序表是否满的
2.判断插入的位置是否正确
3.插入位置后的所有元素依次从后往前向后移动一位
4.将新值插入
//向顺序表中插入元素
//参数:顺序表的首地址,插入位置,插入的数据
//返回值:成功返回OK,失败返回失败原因
int insertList(List *pList,int pos,data_type item)
{
//入参判断
if(NULL == pList)
{
return LISTNULL;
}
int i;
//判断顺序表是否是满的
if(N == pList->count)
{
return FULL;
}
//判断插入位置是否正确
if(pos < 0 || pos > pList->count)
{
return POSERROR;
}
//插入
for(i = pList->count-1;i >= pos;i--)
{
pList->arr[i+1] = pList->arr[i];
}
pList->arr[pos] = item;//插入新值
pList->count++;
return OK;
}
4.查找操作
int showList(List *pList)
{
//入参判断
if(NULL == pList)
{
return LISTNULL;
}
int i;
for(i=0;i < pList->count;i++)
{
printf("%d ",pList->arr[i]);
}
printf("\n");
return OK;
}
5.删除操作
步骤:1.判断顺序表是否为空的
2.判断删除的位置是否正确
3.将要删除的数据保存,查看
4.删除位置后的所有元素依次从前往后向前移动一位
int deleteList(List *pList,int pos,data_type *pData)
{
//入参判断
if(NULL == pList)
{
return LISTNULL;
}
//判断顺序表是否为空
if(0 == pList->count)
{
return EMPTY;
}
//判断删除位置是否有误
if(pos < 0 || pos > pList->count-1 )
{
return POSERROR;
}
//保存要删除的数据
*pData = pList->arr[pos];
int i;
for(i= pos+1; i < pList->count;i++)
{
pList->arr[i-1] = pList->arr[i];
}
pList->count--;
return OK;
}
6.销毁顺序表
//将主函数的pList销毁
int destroyList(List **pList)
{
//入参判断
if(NULL == *pList )
{
return LISTNULL;
}
//释放
free(*pList);
*pList=NULL;
return OK;
}
注意:申请的空间虽然释放了,但是主函数的pList值并没有发生改变
7.程序运行结果