线性表处理
问题描述:
两个递增有序排列的线性表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 }
最后说下这个编辑环境真好,把代码贴上去看得清晰明了。。
本来想删除以前写的,重新把实现的代码放上去,但是算了吧,毕竟无论以前有多么无知,这也是个过程。
有些地方欠缺思考。。
作者:wj704
出处:http://www.cnblogs.com/wj204/