顺序线性表的相关操作
1.线性表的初始化操作(即构造空线性表):initlist_sq(sqlist &l)
就是为顺序表分配一个预定义大小的数组空间,并将线性表长度设为0;其中定义的listsize为当前分配的存储容量,随着元素的增加其存储容量也要增加。因此为其增加了一个存储 LISTINCREMENT个数据元素的空间 。
2. 线性表的插入操作 :在顺序线性表l的第i个位置前插入元素e 。listinsert(sqlist &l,int i ,elmetype e)
第一步判断插入位置是否合法,如果不合法则异常退出。第二步判断线性表存储空间是否不足,如果不足则增加存储容量。第三步将插入位置及之后元素后移。第四步将待插入元素插入。
3.线性表的删除操作。从顺序线性表l中删除第i个元素,并用e返回其值 。
listdelete(sqlist &l,int i,elmetype *e )
第一步判断删除位置是否合法,如果不合法则异常退出。第二步将待删除位置元素的值赋于e。第三步将被删除之后的元素左移 。
4.线性表的查找操作。线性表l查找第一个与元素e满足compare()元素的位置。若在,返回其在l中的次序。若不存在则返回0 。
int locateelem_sq(sqlist *l,elemtype e,status (*compare)(elemtype, elemtype))
第一步设i=1,从线性表第一个位置开始查找。第二步进入循环,判断当前位置的值是否与e相等,并且是否循环到列表最后一个元素。如果未循环到尾部并且值还不相等,则继续循环,寻找符合条件元素的位置。第三步判断,如果当前位置不在线性表尾部,则说明已找到符合的i值。若在性表尾部,则说明循环到最后一个元素也为找到符合元素。返回0;
5.线性表的合并操作。已知la,lb中元素按非递减排列,归并la和lb的元素放入lc中,其也按非递减排列。
void mergelist_sq(sqlist la,sqlist lb,sqlist *lc)
第一步为lc分配空间。第二步进入while循环,如果两个都未循环到表尾,则比较相应位置元素,把较小的元素放入lc中,并且将lc和较小元素的线性表当前位置向后移动一个。直到一个线性表循环完成后,退出此循环。第三步将剩余那个列表中的剩余元素插入lc中。
//线性表的动态分配顺序存储结构
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct
{
elemtype *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量
} sqlist;
//构造空线性表l
status initlist_sq(sqlist &l)
{
l.elem=(elemtype *)malloc(LIST_INIT_SIZE*sizeof(elemtype));
if(!l.elem)
exit(1); //分配失败 ,1为异常退出
l.length=0;
l.listsize= LIST_INIT_SIZE;
return 0;
}
//线性表的初始化操作就是为顺序表分配一个预定义大小的数组空间,并将线性表长度设为0;
//listsize为当前分配的存储容量,随着元素的增加其存储容量也要增加。因此为其增加了一个存储 LISTINCREMENT个数据元素的空间
//插入操作。在顺序线性表l的第i个位置前插入元素e
status listinsert(sqlist &l,int i ,elmetype e)
{
if(i<1||i>l.length+1)
return 0; //i值不合法
if(l.length>=l.listsize)//当前存储位置已满,增加分配
{
newbase=(elmetype *)realloc(l.elem,(listsize+LISTINCREMENT)*sizeof(elemtype));
if(!newbase) //存储分配失败
exit(1);
l.listsize+= LISTINCREMENT;//增加存储容量
}
int *q,*p;
q=&(l.elem[i-1]); //q为插入地址
for(p=&(l.elem[l.listsize-1]);p>=q;p--)//插入位置及之后的元素后移一个位置
*(p+1)=*p;
*q=e; //插入e
l.length++;//表长增加1
return 0;
}
//删除操作。从顺序线性表l中删除第i个元素,并用e返回其值
status listdelete(sqlist &l,int i,elmetype *e )
{
if(i<1||i>l.length+1)
return 0; //i值不合法
int *q,*p;
p=&(l.elem[i-1]); //q为删除元素地址
e=*p;
q=l.elem+l.length-1; //表尾元素位置
for(p++;p<=q;p++) //被删除之后的元素左移 注意初始值为p++
*(p-1)=*p;
l.length--; //表长减1
return 0;
}
//查找操作
int locateelem_sq(sqlist l,elemtype e,status (*compare)(elemtype, elemtype))
{
//在顺序线性表l中查找第一个与元素e满足compare()元素的位置(即返回第一个与e值相等的元素位置)。
//若存在,返回其在l中的次序。若不存在则返回0
int compare(elemtype e1, elemtype e2)
{
if (e1==e2)
return 1;
else
if (e1 > e2) return 0;
else return -1;
}
int i,*p;
i=1;
p=l.elem;//p为第一个元素的存储位置
while(i<=l.length&&!(*compare)(*p++,e))
i++;
if(i<=l.length)
return i;
else return 0;
}
//合并操作
void mergelist_sq(sqlist la,sqlist lb,sqlist *lc)
{
//已知la,lb中元素按非递减排列
//归并la和lb的元素也按非递减排列
pa=la.elem;
pb=lb.elem;
lc.listsize=la.listsize+lb.listsize;
pc=lc.elem= (elemtype *)malloc(lc.listsize*sizeof(elemtype));
if(!lc.elem)
exit(1);//存储分配失败
pa_last=la.elem+la.length-1;
pb_last=lb.elem+lb.length-1;
while(pa<=pa_last&&pb<=pb_last)//归并
{
if(*pa<=*pb)
*pc++=*pa++;
else *pc++=*pb++;
}
while(pa<=pa_last)//插入la剩余元素
*pc++=*pa++;
while(pb<=pb_last)//插入lb剩余元素
*pc++=*pb++;
}