有序表歸并函數(shù)C語言,兩個(gè)有序單鏈表的合并c語言

數(shù)據(jù)結(jié)構(gòu):順序表的合并(C語言)

#include?stdio.h

創(chuàng)新互聯(lián)建站是專業(yè)的樊城網(wǎng)站建設(shè)公司,樊城接單;提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行樊城網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

#include?malloc.h

#include?stdlib.h

#define?LIST_INIT_SIZE?10?//?線性表存儲(chǔ)空間的初始分配量

#define?LISTINCREMENT?2?//?線性表存儲(chǔ)空間的分配增量

struct?SqList

{

int?*elem;?//?存儲(chǔ)空間基址

int?length;?//?當(dāng)前長度

int?listsize;?//?當(dāng)前分配的存儲(chǔ)容量(以sizeof(int)為單位)

};

void?InitList(SqList?L)

{?//?操作結(jié)果:構(gòu)造一個(gè)空的順序線性表

L.elem?=?(int?*)malloc(LIST_INIT_SIZE*sizeof(int));

if?(!L.elem)

exit(0);?//?存儲(chǔ)分配失敗

L.length?=?0;?//?空表長度為0

L.listsize?=?LIST_INIT_SIZE;?//?初始存儲(chǔ)容量

}

int?ListInsert(SqList?L,?int?i,?int?e)

{?//?初始條件:順序線性表L已存在,1≤i≤ListLength(L)+1

//?操作結(jié)果:在L中第i個(gè)位置之前插入新的數(shù)據(jù)元素e,L的長度加1

int?*newbase,?*q,?*p;

if?(i1?||?iL.length?+?1)?//?i值不合法

return?0;

if?(L.length?=?L.listsize)?//?當(dāng)前存儲(chǔ)空間已滿,增加分配

{

if?(!(newbase?=?(int?*)realloc(L.elem,?(L.listsize?+?LISTINCREMENT)*sizeof(int))))

exit(0);?//?存儲(chǔ)分配失敗

L.elem?=?newbase;?//?新基址

L.listsize?+=?LISTINCREMENT;?//?增加存儲(chǔ)容量

}

q?=?L.elem?+?i?-?1;?//?q為插入位置

for?(p?=?L.elem?+?L.length?-?1;?p?=?q;?--p)?//?插入位置及之后的元素右移

*(p?+?1)?=?*p;

*q?=?e;?//?插入e

++L.length;?//?表長增1

return?1;

}

void?Print(SqList?L)

{

int?i;

for?(i?=?0;?iL.length;?i++)

printf("%d?",?*(L.elem?+?i));

printf("\n");

}

//?————————————————————————————————————

//?函數(shù)①

void?MergeList1(SqList?La,?SqList?Lb,?SqList?Lc)

{

int?*pa,?*pa_last,?*pb,?*pb_last,?*pc;

pa?=?La.elem;

pb?=?Lb.elem;

Lc.listsize?=?Lc.length?=?La.length?+?Lb.length;//不用InitList()創(chuàng)建空表Lc

pc?=?Lc.elem?=?(int?*)malloc(Lc.listsize*sizeof(int));

if?(!Lc.elem)?//?存儲(chǔ)分配失敗

exit(0);

pa_last?=?La.elem?+?La.length?-?1;

pb_last?=?Lb.elem?+?Lb.length?-?1;

while?(pa?=?pa_lastpb?=?pb_last)?//?表La和表Lb均非空

{?//?歸并

if?(*pa??*pb)

*pc++?=?*pa++;

else?if?(*pa??*pb)

*pc++?=?*pb++;

else{

*pc++?=?*pa++;

pb++;

Lc.length--;

}

}

while?(pa?=?pa_last)?//?表La非空且表Lb空

*pc++?=?*pa++;?//?插入La的剩余元素

while?(pb?=?pb_last)?//?表Lb非空且表La空

*pc++?=?*pb++;?//?插入Lb的剩余元素

}

//?————————————————————————————————————

//?函數(shù)②

void?MergeList2(SqList?La,?SqList?Lb,?SqList?Lc)

{

int?*pa,?*pa_last,?*pb,?*pb_last,?*pc;

pa?=?La.elem;

pb?=?Lb.elem;

Lc.listsize?=?Lc.length?=?La.length?+?Lb.length;//不用InitList()創(chuàng)建空表Lc

pc?=?Lc.elem?=?(int?*)malloc(Lc.listsize*sizeof(int));

if?(!Lc.elem)?//?存儲(chǔ)分配失敗

exit(0);

pa_last?=?La.elem?+?La.length?-?1;

pb_last?=?Lb.elem?+?Lb.length?-?1;

while?(pa?=?pa_lastpb?=?pb_last)?//?表La和表Lb均非空

{?//?歸并

if?(*pa?=?*pb)

*pc++?=?*pa++;

else

*pc++?=?*pb++;

}

while?(pa?=?pa_last)?//?表La非空且表Lb空

*pc++?=?*pa++;?//?插入La的剩余元素

while?(pb?=?pb_last)?//?表Lb非空且表La空

*pc++?=?*pb++;?//?插入Lb的剩余元素

Lb.length?=?Lc.length;

Lb?=?Lc;

}

//?————————————————————————————————————

//?函數(shù)③

void?Inverse(SqList?L){

int?i,?t;

for?(i?=?0;?i??L.length?/?2;?i++)

{

t?=?*(L.elem?+?i);

*(L.elem?+?i)?=?*(L.elem?+?L.length?-?i?-?1);

*(L.elem?+?L.length?-?i?-?1)?=?t;

}

}

void?main(){

SqList?LA,?LB,?LC;

int?a[4]?=?{?3,?5,?8,?11?},?b[7]?=?{?2,?6,?8,?9,?11,?15,?20?};

int?i;

InitList(LA);

InitList(LB);

InitList(LC);

for?(i?=?0;?i??4;?i++)

ListInsert(LA,?i?+?1,?a[i]);

for?(i?=?0;?i??7;?i++)

ListInsert(LB,?i?+?1,?b[i]);

printf("LA=");

Print(LA);

printf("LB=");

Print(LB);

printf("\n");

MergeList1(LA,?LB,?LC);

printf("①LC=");

Print(LC);

printf("\n");

MergeList2(LA,?LB,?LC);

printf("②LB=");

Print(LB);

printf("\n");

printf("③LC=");

Inverse(LC);

Print(LC);

}

C語言編寫一個(gè)程序?qū)崿F(xiàn)兩個(gè)有序(從小到大)順序表合并成為一個(gè)順序表,合并后的結(jié)果放在第一個(gè)順序表中。

你提到的“奇怪錯(cuò)誤”是由于你的exit宏和函數(shù)重名了,所以預(yù)處理器會(huì)把程序中的exit用-1代替,所以出錯(cuò)。

另外,你的合并函數(shù)也是錯(cuò)誤的,無法達(dá)到要求,整個(gè)程序修改如下:

//---------------------------------------------------------------------------

#include stdio.h

#include stdlib.h //注意這里,exit()函數(shù)要用到這個(gè)文件,這個(gè)文件已經(jīng)包含了malloc()等函數(shù)的聲明

#define OK 1

#define LIST_INIT_SIZE 100

#define OVERFLOW 0

#define EXIT -2 //************注意這里

typedef int ElemType;

typedef int Status;

typedef struct {

ElemType *elem;

int length;

int listsize;

}SqList;

Status InitList_Sq(SqList *L)

{ L-elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!L-elem) exit(OVERFLOW);

L-length=0;

L-listsize=LIST_INIT_SIZE;

return OK;

}

void Create_Sq(SqList *L)

{ int i,n;

printf("創(chuàng)建一個(gè)有序表:\n");

printf("輸入有序表中元素的個(gè)數(shù):");

scanf("%d",n);

L-length=n;

for(i=0;in;i++){

printf("輸入第%d個(gè)元素的值:",i+1);

scanf("%d",L-elem[i]);

printf("\n");

}

}

void Disp_Sq(SqList *L) //************注意這里

{ int i,n;

n=L-length;

for(i=0;in;i++)

printf("%5d",L-elem[i]);

printf("\n");

}

void Combine(SqList *la,SqList *lb) //************注意這里,此函數(shù)被重新編寫

{

ElemType *pa=la-elem,*pb=lb-elem ;

int i,j,k,len_a=la-length,len_b=lb-length;

if ((la-elem=malloc((len_a+len_b)*sizeof(ElemType)))==NULL) exit(OVERFLOW);

for (k=i=j=0; ilen_ajlen_b; ) {

if (pa[i]pb[j]) la-elem[k++]=pa[i++];

else la-elem[k++]=pb[j++];

}

while (ilen_a)

la-elem[k++]=pa[i++];

while (jlen_b)

la-elem[k++]=pb[j++];

la-length=k;

la-listsize=k;

free(pa);

}

void main()

{SqList L1,L2;

InitList_Sq(L1);

InitList_Sq(L2);

Create_Sq(L1);

Disp_Sq(L1);

printf("\n");

Create_Sq(L2);

Disp_Sq(L2); //************注意這里

printf("\n");

Combine(L1,L2);

Disp_Sq(L1); //************注意這里

}

//---------------------------------------------------------------------------

c語言編程,兩個(gè)有序表其元素為遞增有序,將此兩表歸并成一新的有序表并保持遞增

sqlist union(sqlist sa,sqlist sb)

{int sc[maxsize];

sa.length=length(sa);

sb.length=length(sb);

maxsize=sa.length+sb.length;

i=0;

while(isa.lengthisb.length)

{j=0;

if(sa[i]=sb[i]) {sc[j]=sa[i];j++}

i++;

}

while(isa.lengthisb.length)

{sc[j]=sa[i]?sa[i]:sb[i];i++;j++;}

}

解釋下面C語言程序(合并順序表,有順序表La,Lb)

因?yàn)轫樞虮鞮a、Lb都已經(jīng)排好序了,那么要將他們合并成有序表放在Lc中,將La和Lb從他們的初始元素進(jìn)行比較,誰小就將誰放入到Lc中,同時(shí)Lc和放入元素的順序表都指向下一個(gè)元素,然后繼續(xù)循環(huán)。最后肯定會(huì)有一個(gè)順序表先為空,那么就把不為空的順序表中的元素直接復(fù)制到表Lc中即可。

標(biāo)題名稱:有序表歸并函數(shù)C語言,兩個(gè)有序單鏈表的合并c語言
分享鏈接:http://www.muchs.cn/article18/hssigp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站制作電子商務(wù)、外貿(mào)建站做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)