#include?stdio.h
創新互聯建站是專業的樊城網站建設公司,樊城接單;提供網站設計、成都網站建設,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行樊城網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!
#include?malloc.h
#include?stdlib.h
#define?LIST_INIT_SIZE?10?//?線性表存儲空間的初始分配量
#define?LISTINCREMENT?2?//?線性表存儲空間的分配增量
struct?SqList
{
int?*elem;?//?存儲空間基址
int?length;?//?當前長度
int?listsize;?//?當前分配的存儲容量(以sizeof(int)為單位)
};
void?InitList(SqList?L)
{?//?操作結果:構造一個空的順序線性表
L.elem?=?(int?*)malloc(LIST_INIT_SIZE*sizeof(int));
if?(!L.elem)
exit(0);?//?存儲分配失敗
L.length?=?0;?//?空表長度為0
L.listsize?=?LIST_INIT_SIZE;?//?初始存儲容量
}
int?ListInsert(SqList?L,?int?i,?int?e)
{?//?初始條件:順序線性表L已存在,1≤i≤ListLength(L)+1
//?操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1
int?*newbase,?*q,?*p;
if?(i1?||?iL.length?+?1)?//?i值不合法
return?0;
if?(L.length?=?L.listsize)?//?當前存儲空間已滿,增加分配
{
if?(!(newbase?=?(int?*)realloc(L.elem,?(L.listsize?+?LISTINCREMENT)*sizeof(int))))
exit(0);?//?存儲分配失敗
L.elem?=?newbase;?//?新基址
L.listsize?+=?LISTINCREMENT;?//?增加存儲容量
}
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");
}
//?————————————————————————————————————
//?函數①
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()創建空表Lc
pc?=?Lc.elem?=?(int?*)malloc(Lc.listsize*sizeof(int));
if?(!Lc.elem)?//?存儲分配失敗
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的剩余元素
}
//?————————————————————————————————————
//?函數②
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()創建空表Lc
pc?=?Lc.elem?=?(int?*)malloc(Lc.listsize*sizeof(int));
if?(!Lc.elem)?//?存儲分配失敗
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;
}
//?————————————————————————————————————
//?函數③
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);
}
你提到的“奇怪錯誤”是由于你的exit宏和函數重名了,所以預處理器會把程序中的exit用-1代替,所以出錯。
另外,你的合并函數也是錯誤的,無法達到要求,整個程序修改如下:
//---------------------------------------------------------------------------
#include stdio.h
#include stdlib.h //注意這里,exit()函數要用到這個文件,這個文件已經包含了malloc()等函數的聲明
#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("創建一個有序表:\n");
printf("輸入有序表中元素的個數:");
scanf("%d",n);
L-length=n;
for(i=0;in;i++){
printf("輸入第%d個元素的值:",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) //************注意這里,此函數被重新編寫
{
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); //************注意這里
}
//---------------------------------------------------------------------------
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++;}
}
因為順序表La、Lb都已經排好序了,那么要將他們合并成有序表放在Lc中,將La和Lb從他們的初始元素進行比較,誰小就將誰放入到Lc中,同時Lc和放入元素的順序表都指向下一個元素,然后繼續循環。最后肯定會有一個順序表先為空,那么就把不為空的順序表中的元素直接復制到表Lc中即可。
標題名稱:有序表歸并函數C語言,兩個有序單鏈表的合并c語言
分享鏈接:http://vcdvsql.cn/article18/hssigp.html
成都網站建設公司_創新互聯,為您提供品牌網站設計、品牌網站制作、電子商務、外貿建站、做網站、外貿網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯