##线性表总结

#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中只剩下三个表中均包含的数据元素的结点。

posted @ 2019-03-25 21:19  真真假假真真  阅读(92)  评论(0)    收藏  举报