顺序表示
最近在学数据结构中的顺序表示一节,整理如下。
1.存储结构
概念:将线性表中的元素一个接一个的存储在一片相邻的存储区域中,这种顺序表示的线性表也成为顺序表。
为了反映出线性表中元素的个数
n
n
n和元素
e
l
e
m
e
n
t
element
element的关系,引入
SeqList结构,它定义为:
struct SeqLitint
{ int MAXNUM; //顺序表中最大的元素个数
int n; //存放在顺序表中元素的个数;
DataType * element;
/* element[0] 、element[1],……,element[n-1] 存放线性表中的元素 */
};
为了使用方便可以定义一个指向SeqList结构的指针类型:
typedef struct SeqList *PSeqList ;
注意这里是定义了一个类型,下面可以直接用
如果palist是一个指向SeqList类型的指针变量,
则palist->MAXNUM表示顺序表中最大元素的个数;
palist->n表示顺序表中实际元素的个数;
palist->element [0],…,palist->element[palist->n-1] 就是顺序中的各个元素。
2.各种运算的实现
1.创建空顺序表
PSeqList creatNULLList_seq (int m){
PSeqList palist =(PSeqList)malloc(sizeof(struct SeqList));
//给结构分配空间;
if(palist!=NULL) {
palist->element =(DataType *) malloc (sizeof(DataType)*m);
//给数组element分配空间
if(palist->element){
palist ->MAXNUM=m;
palist ->n =0 ; //空顺序表长度为0
return palist;
}
else free(palist);
}
printf("Failed!\n"); //存储分配失败
return NULL;
}
2.判断顺序表是否为空
若为空则返回1,否则返回0;
int isNullList_seq(PSeqList palist)
{ return (palist ->n ==0); }
3.在顺序表中求某元素的下标
int locate_seq(PSeqList palist,DataType x)
{
int p;
for(p=0; p<palist->n; p++)
{
if(palist->element[p]==x)
return p;
}
return -1;
}
4.顺序表的插入
int insertPre_seq(PSeqList palist, int p, DataType x) {
int q;
if (palist->n > = palist-> MAXNUM) //溢出
{
prinft(“Overflow!\n”);
return 0;
}
if (p <0 || p> palist ->n )
{
printf(“Not exist! \n”);
return 0;
}
for (q=palist->n-1; q>=p; q--) //注意要从最后一个开始往后移
palist -> element[q+1] = palist -> element[q] ; //全部后移一个
palist->element[p] = x ;
palist->n = palist->n +1; //元素个数+1
return 1;
}
这是前插法,后插法也差不多,修改几个数据即可。
5.顺序表的删除
int deleteP_seq(PSeqList palist ,int p)
//p为要删除的数的下标
{
int q;
if (p <0 || p> palist ->n )
{
printf(“Not exist! \n”);
return 0;
}
for( q=p;q<=n-1;q++) //将被删除元素后面的元素均往前移一位
{
palist->element[q]=palist->element[q+1]
}
palist->n=palist->n-1;
return 1;
}
如果给出一个数x要删除,则先用前面提到的locate函数找到这个数的下标。
在顺序表的插入中存在溢出的问题,这时候可以重新分配空间。后续我讲整理一下malloc 、calloc、realloc 这三个函数。