顺序表
优点
- 地址连续,大小固定
- 存储密度大
- 除第0个元素外,其余元素都有前驱;除最后一个元素外,其余元素都有后继
- 可以通过下标访问,访问非常方便
- 插入和删除都需要移动元素,不方便
缺点
- 地址连续的大空间,有时申请会失败
- 插入和删除时,移动元素,效率比较低
顺序表的定义
typedef int datatype; //方便后续数据类型的修改
typedef struct orderlist
{
datatype * pdata;//一个指针指向连续的存储空间
int size;//存储空间的大小
int count;//已经存储的数据个数;
} LIST;
顺序表的创建
/***************************************************
函数名:create
函数功能:创建顺序表
函数参数:顺序表的大小
函数返回值:创建成功返回顺序表的首地址;失败返回NULL
****************************************************/
LIST * create(int size)
{
LIST * plist=(LIST *)malloc(sizeof(LIST));
if(NULL==plist)
{
return NULL;
}
plist->pdata=(datatype *)malloc(sizeof(datatype)*size);
if(NULL==plist->pdata)
{
free(plist);
plist=NULL;
return NULL;
}
memset(plist->pdata,0,sizeof(datatype)*size);
plist->size=size;
plist->count=0;
return plist;
}
顺序表的插入
插入分为三种情况
- 头插
- 尾插
- 中间插入
/***************************************************
函数名:insert
函数功能:向顺序表中指定位置插入元素
函数参数:1.顺序表地址 2.插入元素 3.插入位置
返回值:成功返回0;失败返回-1;
*****************************************************/
int insert(LIST * plist,datatype newdata,int offset)
{
int i=0;
if(NULL==plist || NULL==plist->pdata || plist->count==plist->size || offset>plist->size ||offset<0)
{
return 0;
}
if(plist->count==offset) //尾插
{
plist->pdata[plist->count]=newdata;
plist->count++;
return 0;
}
else{
for(i=plist->count-1;i>=0;i--)
{
plist->pdata[i+1]=plist->pdata[i];
}
plist->pdata[offset]=newdata;
plist->count++;
return 0;
}
}
顺序表的删除
- 头删
- 尾删
- 中间删除
思维图参考于插入,有点懒就不画图了~~
/**************************************
函数名:delete
函数功能:删除顺序表指定位置的数据
函数参数:1.顺序表的地址 2.被删除的元素 3.删除的位置
函数返回值:成功时,返回0;失败时,返回-1;
***************************************/
int delete(LIST *plist,datatype *savedata,int offset)
{
int i=0;
if(NULL==plist || NULL==plist->pdata || 0==plist->count || offset>plist->count || offset<0)
{
return -1;
}
if((plist->count-1)==offset)
{
if(NULL!=savedata)
{
*savedata=plist->pdata[offset];
}
plist->count--;
return 0;
}
else
{
if(NULL!=savedata)
{
*savedata=plist->pdata[offset];
}
for(i=offset;i<plist->count-1;i++)
{
plist->pdata[i]=plist->pdata[i+1];
}
plist->count--;
return 0;
}
}
顺序表的修改
/**********************************************
函数名:alter
函数功能:修改指定位置数据;
函数参数:1.顺序表的地址 2.新的数据 3.修改的位置 4.保存被修改的值
返回值:成功返回0;失败返回-1;
*********************************************/
int alter(LIST *plist,datatype newdata,int offset,datatype *savedata)
{
if(NULL==plist || NULL==plist->pdata || 0==plist->count || offset>plist->count || offset<0)
{
return -1;
}
if(NULL!=savedata)
{
*savedata=plist->pdata[offset];
}
plist->pdata[offset]=newdata;
return 0;
}
顺序表的查看
/***********************************************
函数名:show
函数功能:查看顺序表中的数据
函数参数:顺序表地址plist
函数返回值:无
***********************************************/
void show(LIST *plist)
{
int i=0;
if(NULL==plist || NULL==plist->pdata)
{
return;
}
for(i=0;i<plist->count;i++)
{
printf("%d ",plist->pdata[i]);
}
printf("\n\r");
}
顺序表的销毁
/****************************************************
函数名:destroy
函数功能:销毁顺序表
函数参数:顺序表的地址
函数返回值:无
**************************************************/
void destroy(LIST *plist)
{
if(NULL==plist)
{
return ;
}
free(plist->pdata);
plist->pdata=NULL;
free(plist);
plist=NULL;
}