##线性表总结
#1.代码段1简介
找出两个长度相同、升序序列顺序表存储的序列A、B的中位数的数值。
##1.1代码1
ElemType_Search(SqList *A,SqList *B)//1 { //2 int i=0,j=0,k=0; //3 while(i<A->length&&j<B->length) //4 { //5 k++; //6 if(A->data[i]<B->data[j]) //7 { //8 if(k==A->length) //9 return A->data[i]; //10 i++; //11 } //12 else //13 { //14 if(k==B->length) //15 return B->data[j]; //16 j++; //17 } //18 } //19 } //20
##1.2不懂的地方
第七行到第十八行中(功能不懂):
要怎么比较以后才进入里面的一个if语句?当i=A->length的时候会怎么样?
自己的解释:
比较的次数应该是确定的即当k=A->length或者k=B->length时不再进入while循环,而A、B长度相同,所以进入第二个if循环的条件应该是k等于A、B顺序表长度,A->data[i]和B->data[j]中更小的那个值被返回,而这个值就是A、B顺序表的中位数;当i=A->length的时候,会停止进入while循环,再此之前应该已经找到了中位数。
#2.代码段2简介
已知3个带头结点的单链表LA、LB和LC中的结点均依元素值递增排列(假设每个单链表不存在数据值相同的结点,但3个单链表中可能存在数据值相同的结点),设计一个算法对LA链表进行如下操作:使操作后的链表LA中仅留下3个表中均包含的数据元素的结点,且没有数据值相同的结点,并释放LA中所有的无用结点。要求算法的时间复杂度为O(m+n+p),其中m、n和p分别为3个表的长度。
##2.1代码2
void Commnode(LinkNode *&LA,LinkNode *LB,LinkNode *LC) //1 { //2 LinkNode *pa=LA->next, *pb=LB->next,*pc=LC->next,*q,*r; //3 LA->next=NULL; //4 r=LA; //5 while(pa!=NULL) //6 { //7 while (pc!=NULL&&pa->data>pc->data) //8 pb=pb->next; //9 while(pc!=NULL&&pa->data>pc->data) //10 pc=pc->next; //11 if (pb!=NULL&&pc!=NULL&&pa->data==pb->data&&pa->data==pc->data)//12 { //13 r=->next=pa; //14 r=pa; //15 pa=pa->next; //16 } //17 else //18 { //19 q=pa; //20 pa=pa->next; //21 free(q); //22 } //23 } //24 r->next=NULL; //25 } //26
##2.2不懂的地方
第六行到第二十四行中(功能不懂):
怎么找三个表中均包含的数据元素的结点?pa、r的作用各是什么?如果指向的不是公共结点的话,怎么办?
自己的解释:
按指向的顺序来比较pa指向的值和LB、LC中的结点数据值的大小,因为是递增排列,如果不相等,则让LC、LB指向下一个,再比较,如果在pc、pb指向不为空时,找到一个pa等于pc和pb,则此时的pa即为三个表中均包含的数据元素的结点;pa用于和pb、pc指向的数据值比较,找出三个表中均包含的数据元素的结点,r用于让三个表中均包含的数据元素的结点放置于LA链表中;如果指向的不是公共结点的话,这个在LA链表中的结点会被销毁删除,最后使LA中只剩下三个表中均包含的数据元素的结点。