线性表处理

问题描述:

两个递增有序排列的线性表A和B,均以单链表做存储结构,编写算法,将两个表归并成一个递减有序的线性表C,要求C利用A, B表的结点空间

问题分析:

首先如果C表也是一个递增有序的,是不是简单些呢?当然,如果C是递增有序的,只要遍历两个表的中值,比较他们的大小,小的在大的前面,遍历完了以后,C表也就合并成了

在这里它要求C表是递减有序的,哪问题的关键是不是把递增变成递减呢?又要怎么去变呢?

想起昨天看过的算法,将首元节点变成尾元节点。说实话,暂时还是没想到好法子去变。。。经验少了,看的算法少了,看了下书,知道怎么弄了,把自己理解的重新理清楚下。

C表是利用A,B表的节点空间的,可以让A->next=null,或者B->next=null后,赋值给C;A,B 两个表原来是递增的,对不,也就是说,遍历的时候最先出来的是最小的,再在C前面依次添加最小的数据,这样就能实现逆置了。(这样的实现方式让我对链表有了进一步理解)

解题算法如下:

 1  Status ListMergeOppose_L(LinkList &A,LinkList &B,LinkList &C)
 2     {
 3          LinkList pa,pb,qa,qb;
 4          pa=A;
 5          pb=B;
 6          qa=pa;
 7          qb=pb;
 8          pa=pa->next;
 9          pb=pb->next;
10          B->next=NULL;
11          C=B;
12     while(pa&&pb)
13        {
14         if(pa->data>pb->data)
15          {
16             qa=pa;
17             pa=pa->next;
18             qa->next=B->next;
19             B->next=qa;
20          }
21         else
22         {
23               qb=pb;
24               pb=pb->next;
25               qb->next=B->next;
26               B->next=qb;
27         }
28        }
29    while(pa)
30    {
31      qa=pa;
32      pa=pa->next;
33      qa->next=B->next;
34      B->next=qa;
35    }
36   while(pb)
37    {
38      qb=pb;
39      pb=pb->next;
40      qb->next=B->next;
41      B->next=qb;
42     }
43    pa=A;
44    free(pa);
45    return OK;
46  }

最后说下这个编辑环境真好,把代码贴上去看得清晰明了。。

 本来想删除以前写的,重新把实现的代码放上去,但是算了吧,毕竟无论以前有多么无知,这也是个过程。

有些地方欠缺思考。。

 

posted @ 2013-04-22 10:15  wj704  阅读(217)  评论(0编辑  收藏  举报