當前位置:成語大全網 - 書法字典 - 如何用C語言編譯合並兩個順序線性表?

如何用C語言編譯合並兩個順序線性表?

1、?最初的想法:把A和B都扔進C,然後對C進行排序,人們壹開始總會想到最懶的方法,這往往是效率最低的。

改進:既然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);

}