1.代码段1简介:采用二路归并法将有序表进行合并。
1.1代码1
void UnionList1(LinkNode * LA, LinkNode * LB, LinkNode &LC) { LinkNode pa=LA->next, * pb=LB-> next,r,s; //1
LC=(LinkNode )malloc( sizeof( LinkNode)); //2 r=LC; //3 while (pa!=NULL && pb!= NULL) //4 { if (pa -> data< pb -> data) //5 { s=(LinkNode )malloc( sizeof(LinkNode); //6 s -> data= pa -> data; //7 r->next=s; //8 r=s; //9 pa=pa - next; //10 } else { s =(LinkNode * )malloc(sizeof( LinkNode)); //11 s-> data=pb-> data; //12 r-> next=s;r= s; //13 pb= pb -> next; //14 } } while (pa!= NULL) //15 { s=(LinkNode ) malloc(sizeof(LinkNode)); //16 s-> data=pa -> data; //17 r > next=s;r=s; //18 pa=pa->next; //19 } while (pb!= NULL) //20 { s= (LinkNode ) malloc(sizeof( LinkNode)); //21 s-> data= pb -> data; //22 r-> next=s;r= s; //23 pb=pb -> next; //24 } r-> next= NULL; //25 }2.不懂的地方:第3和第8句(包含有指针r的句子)。
语法不懂:为什么要定义一个指针*r指向LC,LC不是空链表么,为什么第8句不直接写成LC->next=s?
分析:该段代码在运行过程中分别扫描LA,LB两个有序表,比较LA,LB当前元素,讲其中较小的元素放入LC中,再从较小元素所在的有序表中取下一个元素。2.代码段2简介:求两个有序表归并后的中位数
2.1代码2
ElemType M_Search(SqList A,sQlist B)
{ int i=0,j=0,k=0; //1 while(ilength&&jlength) //2 { k++; //3 if(A->data[i]data[j]) //4 { if(k==A->length) //5 return A->data[i]; //6 i++; //7 } else { if(k==B->length) //8 return B->data[j]; //9 j++; //10 } } }2.2不懂得地方:2-10句,功能不懂。函数运行归并过程中会将相同的元素删除,为什么k=A->length时进行归并的那个元素就是中位数?
分析:分别扫描顺序表A,B,将较小的数取出后,被取数的顺序表指针往下指,再继续比较两个顺序表的大小,直到找出中位数。