以下是数据结构中关于有序顺序表的合并的基础操作(编程风格参考严蔚敏版数据结构)。
头文件及宏#include#include using namespace std; #define ElemType int #define MAXSIZE 20
说明:ElemType 定义为int的目的是方便以后同意我们所需定义的元素的类型,比如如果以后想把结构体内的元素类型改为char,只需要在ElemType 这里宏定义为char即可(当然,编程的过程中关于元素的类型也要写ElemType)
定义顺序表typedef struct SqList{
ElemType *elem;
int length;
}Sqlist,*Sl;
初始化
void initial(Sqlist &L){
L.elem = new ElemType[MAXSIZE];
L.length = 0;
}
特别注意:这里传进来的是一个实体,如果传进来的是指针,要先给指针开辟内存空间:L = new Sqlist;
合并过程void merge(Sqlist &L3,Sqlist &L1,Sqlist &L2){
ElemType *L1_last;
ElemType *L2_last;
ElemType *p1,*p2,*p3;
//
L3.length = L1.length + L2.length;//L3的长度是L1的长度+L2的长度
L3.elem = new ElemType[L3.length];//为L3的元素数组开辟空间
p1 = L1.elem;//p1指向L1的元素数组
p2 = L2.elem;//p2指向L2的元素数组
p3 = L3.elem;//p3指向L3的元素数组
L1_last = L1.elem+L1.length-1;//标记L1元素数组的末尾
L2_last = L2.elem+L2.length-1;//标记L2元素数组的末尾
while(p1<=L1_last&&p2<=L2_last){//当有顺序表添加完毕后就跳出
if(*p1<*p2){//如果当前L1元素数组的值大于
*(p3)++=*(p1)++;
//将小的值填入L3,然后指针两个指针均往下移动一个位置;
}else{
*p3++=*p2++; //上一行是其完整写法
}
}
while(p1<=L1_last)*p3++=*p1++;//如果L1有元素剩余,将剩下的元素填入L3中
while(p2<=L2_last)*p3++=*p2++;//如果L2有元素剩余,剩下的元素填入L3中
}
说明:书本上的代码是简写,关于声明的部分猜测是因为篇幅并没有写出来,这让很多初学的小白照着书本的代码敲发现运行不了,缺这个却那个。当然这个只是我自己的理解补充完整的代码,不一定对,补充方式也绝不唯一。
步骤:
1、创建三个指针p1 p2 p3,分别指向L1、L2、L3的elem开头(elem其实是一个数组);
2、创建两个指针L1_last L2_last,分别指向L1、L2的elem的末尾(用来标记p1 或者 p2走到其对应的elem末尾);
3、将p1 p2放入while循环,不管哪个先到末尾(即地址与last相等)都跳出该循环;
4、在循环中,将p1和p2对应的值相对较小的那一个值赋给p3对应的位置的值,然后相关的指针往下移动一个位置(如果使用的是p1的值就移动p1和p3,如果使用的是p2的值就移动p2和p3);
5、循环跳出后将剩余的元素全部装入L3。
注意:*p3++=*p2++语义:将p2指向的地址的值取出来,赋给p3指向的地址的值,然后两个指针同时往下移动一个位置。
完整源代码:#include#include #include #include using namespace std; #define ElemType int #define MAXSIZE 20 typedef struct SqList{ ElemType *elem; int length; }Sqlist,*Sl; void showList(Sqlist &L){ for(int i=0;i cout< L.elem = new ElemType[MAXSIZE]; L.length = 0; } // void merge(Sqlist &L3,Sqlist &L1,Sqlist &L2){ ElemType *L1_last; ElemType *L2_last; ElemType *p1,*p2,*p3; // L3.length = L1.length + L2.length; L3.elem = new ElemType[L3.length]; p1 = L1.elem; p2 = L2.elem; p3 = L3.elem; L1_last = L1.elem+L1.length-1; L2_last = L2.elem+L2.length-1; while(p1<=L1_last&&p2<=L2_last){//当有顺序表添加完毕后就跳出 if(*p1<*p2){ *(p3)++=*(p1)++; //下一行是其简要写法 }else{ *p3++=*p2++; //上一行是其完整写法 } } while(p1<=L1_last)*p3++=*p1++;//如果L1有元素剩余,将省下的元素填入L3中 while(p2<=L2_last)*p3++=*p2++;//如果L2有元素剩余,省下的元素填入L3中 } int main(){ SqList List1; Sqlist List2; initial(List1); initial(List2); List1.elem[0]=1;List1.elem[1]=3;List1.elem[2]=4;List1.elem[3]=5;List1.elem[4]=7; List1.length = 5; List2.elem[0]=2;List2.elem[1]=3;List2.elem[2]=5;List2.elem[3]=6; List2.length = 4; showList(List1); showList(List2); Sqlist List3; merge(List3,List1,List2); showList(List3); return 0; }
说明:为了方便,偷了个懒直接写死两个顺序表的值。
运行结果 暑期编程PK赛 得CSDN机械键盘等精美礼品!


