改進:既然A和B的順序很好,那麽先把A扔進C,然後再壹個壹個的找B元素插入。這樣做需要頻繁移動元素,如果線性表不是鏈表的話,代價會很大。
進壹步改進:從A和B中取壹個元素,比較後把小的放入C中,從剛剛取出元素的表中再取壹個元素,再次比較,把小的放入C中,重復這個操作,直到把A和B中的元素都取完,然後把剩下的元素都扔進C中。
2.常規:
#包含?& ltstdlib.h & gt
/*順序表的最小存儲空間長度*/
#定義?LISTMINSIZE?10
/*順序表存儲結構類型的定義*/
typedef?結構體
{
ListDT * base?/*序列表空間基址*/
intlistsize/*序列表空間大小*/
intlen/*序列表的長度*/
} SeqList
/*序列表初始化*/
作廢?ListInitialize(SeqList?*pL,?int?尺寸)
{
if(size & lt;LISTMINSIZE)
size = LISTMINSIZE?/*限制不能小於最小大小*/
pL-& gt;listsize = size
pL-& gt;base =(list dt *)malloc(pL-& gt;listsize * sizeof(list dt));
如果(!pL-& gt;基地)
退出(EXIT _ FAILURE);
pL-& gt;len = 0;/*初始化空表*/
}
/*根據給定的下標*/取順序表的元素值
布爾?ListElem(SeqList?l,?int?指數,?ListDT?*pelem)
{
BOOLflg = TRUE
if(index & lt;0||?index & gtL.len-1?)
flg = FALSE/*參數越界*/
其他
* pelem = l . base[index];
returnflg
}
/*求序列表的長度*/
int?ListLen(SeqList?l)
{
returnL.len?
}
/*在序列表中指定的序號位置插入元素*/
布爾?ListInsert(SeqList?*pL,?int?pos,?ListDT?d)
{
BOOLflg = TRUE
inti
如果(pos & lt0||?pL-& gt;len & gt= pL->;listsize?||?pos & gtpL-& gt;len)
flg = FALSE
其他
{
for(I = pL-& gt;len-1;我& gt= pos?我-)?/*移動數據*/
pL-& gt;base[i+1]=pL->base[I];
pL-& gt;base[pos]= d;/*寫入數據*/
pL-& gt;len++;?/*表長度增加了1*/
}
returnflg
}
/*刪除序列表中具有指定序列號的元素*/
布爾?ListDel(SeqList?*pL,?int?位置)
{
BOOLflg = TRUE
inti
如果(pos & lt0||?pos & gt= pL->;len)
flg = FALSE
其他
{
for(I = pos+1;我& ltpL-& gt;len?I++)/*移動數據*/
pL-& gt;base[i-1]=pL->base[I];
pL-& gt;len-;?/*表長度增加了1*/
}
returnflg
}
/*在序列表中查找元素*/
int?ListLoc(SeqList?l,?ListDT?d,布爾?(*equal)(ListDT,ListDT))
{
int pos = l . len-1;
while(pos & gt;= 0 & amp& amp?!(*相等)(L.base[pos],d))
pos-;
returnpos
}
/*取前導元素序號位置*/
布爾?ListPrior(SeqList?l,?int?pos,?int?*ppriorpos)
{
BOOLflg = TRUE
if(pos & gt;0 & amp& amp?pos & ltL.len)
* ppriorpos = pos-1;
其他
flg = FALSE
returnflg
}
/*獲取後續元素的序列號位置*/
布爾?ListNext(SeqList?l,?int?pos,?int?*pnextpos)
{
BOOLflg = TRUE
if(pos & gt;= 0 & amp& amp?pos & ltlen-1)
* pnextpos = pos+1;
其他
flg = FALSE
returnflg
}
/*銷毀順序表*/
作廢?ListDestroy(SeqList?l)
{
免費(l . base);
}
#endif
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
暗示性測試程序
*/
typedef?enum?{TRUE=1,FALSE=0}?BOOL
typedef?int?ListDT
#包含?" seqlist.c "
作廢?printSeqList(SeqList?l)
{
inti
ListDTx
printf(" \ n list:\ n ");
for(I = 0;我& lt利斯特倫(左);?i++)
{
ListElem(L,I & amp;x);
printf("%3d ",x);
}
}
布爾?dataequal(int?x,?int?y)
{
return(x = = y)TRUE:FALSE;
}
#定義?n?五
作廢?主()
{
inti,prior,next
ListDTx,test[N]={10,20,30,40,50 };
SeqListL
/*初始化序列表*/
list initialize(& amp;l,N);
/*在標題中插入n個元素*/
for(I = 0;我& ltn;?i++)
list insert(& amp;l,0,test[I]);
printSeqList(L);
/*刪除元素*/
list del(& amp;l,N/2);
printSeqList(L);
printf(" \ n輸入?key:\ n ");
scanf("%d ",& ampx);
/*找出x在表格中的位置*/
i=ListLoc(L,x,data equal);
/*找到x的前導元素*/
if(ListPrior(L,I,& amp先驗))
{
ListElem(L,prior & amp;x);
printf("Prior:%d\n ",x);
}
其他
printf("noPrior。\ n ");
/*查找x的後繼*/
if(ListNext(L,I,& amp下壹個))
{
ListElem(左,下壹個,& ampx);
printf("Next:%d\n ",x);
}
其他
printf(" nonexit。\ n ");
/*查找表格長度*/
printf("Listlength=%d ",list len(L));
/*銷毀順序表*/
list destroy(L);
}