本节代码主要来自王道单科18页的综合应用题。
七、将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表
易忘点:合并以前需要先判断一下是否大于C的最大长度。
核心代码:
bool merge(Sqlist A,Sqlist B,Sqlist &C){ if(A.length+B.length>MaxSize) return false; //容易忘记 int i=0,j=0,k=0; while(i<=A.length-1&&j<=B.length-1){ if(A.data[i]<=B.data[j]){ C.data[k++]=A.data[i++]; } else C.data[k++]=B.data[j++]; } while(i<=A.length-1){ C.data[k++]=A.data[i++]; } while(j<=B.length-1){ C.data[k++]=B.data[j++]; } C.length=A.length+B.length; //第一次居然写出了C.length=A.length+B.length-2; 真的很离谱。 //也可以写成C.length=k+1; return true; }
全部代码:
#include<stdio.h> #define true 1 #define false 0 #define MaxSize 100 #define ElemType int #define Status int typedef struct{ ElemType data[MaxSize]; int length; }Sqlist; //构造一个空的线性表L void InitList(Sqlist &L){ L.length=0; } bool ListInsert(Sqlist &L,int i,ElemType e){ //将元素e插到顺序表L中第i个位置 if(i<1||i>L.length+1) return false; if(L.length>=MaxSize) return false; for(int j=L.length;j>=i;j--) L.data[j]=L.data[j-1]; L.data[i-1]=e; L.length++; return true; } void ListLoad(Sqlist L){ if(L.length==0){ printf("当前顺序表为空\n"); return; } printf("当前顺序表元素为:"); for(int i=0;i<L.length;i++) printf("%d ",L.data[i]); printf("\n"); return; } bool merge(Sqlist A,Sqlist B,Sqlist &C){ if(A.length+B.length>MaxSize) return false; //容易忘记 int i=0,j=0,k=0; while(i<=A.length-1&&j<=B.length-1){ if(A.data[i]<=B.data[j]){ C.data[k++]=A.data[i++]; } else C.data[k++]=B.data[j++]; } while(i<=A.length-1){ C.data[k++]=A.data[i++]; } while(j<=B.length-1){ C.data[k++]=B.data[j++]; } C.length=A.length+B.length; //第一次居然写出了C.length=A.length+B.length-2; 真的很离谱。 //也可以写成C.length=k+1; return true; } int main(){ Sqlist A; Sqlist B; Sqlist C; InitList(A); InitList(B); InitList(C); ListInsert(A,1,9); ListInsert(A,1,8); ListInsert(A,1,7); ListInsert(A,1,4); ListInsert(B,1,8); ListInsert(B,1,5); ListInsert(B,1,5); ListInsert(B,1,1); ListInsert(B,1,1); ListLoad(A); ListLoad(B); if(merge(A,B,C)) { printf("合并成功 "); ListLoad(C); } else printf("合并失败 "); }