本节代码主要来自王道单科18页的综合应用题。
八、已知在一维数组A[m+n]中依次存放着两个线性表(a1,a2,a3,....am)和(b1,b2,b3,...bn)。试编写一个函数,将数组中 两个顺序表的位置互换,即将(b1,b2,b3,...bn)放在(a1,a2,a3,....am)前面。
要特别注意exchange里面的Reverse函数的顺序。分两种情况:
第一种:先逆置两边的元素,再逆置所有元素。
Reverse1(A,0,m-1); 此时前面为线性表A,元素依然是m个
Reverse1(A,m,m+n-1);
Reverse1(A,0,m+n-1);
第二种:先逆置所有元素,再逆置两边元素。
Reverse1(A,0,m+n-1);
Reverse1(A,0,n-1); 经过逆置后前面为线性表B,元素是n个 Reverse1(A,n,m+n-1);
核心代码:
void Reverse1(Sqlist &L,int left,int right){ //自己写的代码 if(left>=right||right>=MaxSize) return ;//容易忘记 int i,j; ElemType temp; for(i=left,j=right;i<j;i++,j--){ temp=L.data[i]; L.data[i]=L.data[j]; L.data[j]=temp; } } void exchange1(Sqlist &A,int m,int n){ Reverse1(A,0,m-1); Reverse1(A,m,m+n-1); Reverse1(A,0,m+n-1); }
void Reverse2(Sqlist &L,int left,int right){ //书上的代码 if(left>=right||right>=MaxSize)return; int mid=(left+right)/2; ElemType temp; for(int i=0;i<=mid-left;i++){ temp=L.data[left+i]; L.data[left+i]=L.data[right-i]; L.data[right-i]=temp; } } void exchange2(Sqlist &A,int m,int n){ Reverse2(A,0,m-1); Reverse2(A,m,m+n-1); Reverse2(A,0,m+n-1); }
全部代码:
#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; } void Reverse1(Sqlist &L,int left,int right){ //自己写的代码 if(left>=right||right>=MaxSize) return ;//容易忘记 int i,j; ElemType temp; for(i=left,j=right;i<j;i++,j--){ temp=L.data[i]; L.data[i]=L.data[j]; L.data[j]=temp; } } void exchange1(Sqlist &A,int m,int n){ Reverse1(A,m,m+n-1); Reverse1(A,0,m-1); Reverse1(A,0,m+n-1); } void Reverse2(Sqlist &L,int left,int right){ //书上的代码 if(left>=right||right>=MaxSize)return; int mid=(left+right)/2; ElemType temp; for(int i=0;i<=mid-left;i++){ temp=L.data[left+i]; L.data[left+i]=L.data[right-i]; L.data[right-i]=temp; } } void exchange2(Sqlist &A,int m,int n){ Reverse2(A,m,m+n-1); Reverse2(A,0,m-1); Reverse2(A,0,m+n-1); } int main(){ Sqlist T; InitList(T); ListInsert(T,1,9); ListInsert(T,1,8); ListInsert(T,1,7); ListInsert(T,1,7); ListInsert(T,1,5); ListInsert(T,1,5); ListInsert(T,1,5); ListInsert(T,1,1); ListInsert(T,1,1); ListLoad(T); exchange1(T,4,5); printf("我的代码转换结果 "); ListLoad(T); exchange2(T,4,5); printf("书上的代码转换结果 "); ListLoad(T); }