C语言数据结构 链表的合并

来源:互联网 发布:电脑数据恢复软件扫描 编辑:程序博客网 时间:2024/04/27 10:02

有的时候课本上的伪代码真的很让人而无语

今天复习了一下数据结构

发现了一伪代码是这么写的

void reverse_merge(LinkList &A,LinkList &B,LinkList &C)//把元素
递增排列的链表A 和B 合并为C,且C 中元素递减排列,使用原空间
{
pa=A->next;pb=B->next;pre=NULL; //pa 和pb 分别指向A,B 的当前元素
while(pa||pb)
{
if(pa->data<pb->data||!pb)
{
pc=pa;q=pa->next;pa->next=pre;pa=q; //将A 的元素插入新表
}
else
{
pc=pb;q=pb->next;pb->next=pre;pb=q; //将B 的元素插入新表
}
pre=pc;
}
C=A;A->next=pc; //构造新表头
}//reverse_merge
分析:本算法的思想是,按从小到大的顺序依次把A 和B 的元素插入新表的
头部pc 处,最后处理A 或B 的剩余元素.

我建了个链表 升序排列以后 用这个代码改 程序老是死亡。。。

最后发现是if(pa->data<pb->data||!pb)出现了问题,怪谁呢?还是自己学的不好。。。

代码还算清晰 今天没白忙^!^

# include <stdio.h># include <stdlib.h># include <time.h># define SRAND 501  //产生SRAND以内的随机数# define M 60  //产生M个随机数typedef struct LB{    //链表Lian Biaoint data;   //当前结点的值struct LB* Q; //指向下一节点的指针Q}LB;LB *Insert(LB *head,int DATA);  //在已经按照升序排列的链表中插入节点值DATA 返回插入新热点之后的头指针LB *HB(LB *A,LB *B);//合并  把元素递增的链表A B 合并成递减排列 ,使用原来的空间 返回合并后的头结点int main(){    int i;    LB *P=NULL,*S=NULL,*T=NULL,*X,*Y;srand(time(NULL));//产生随机种子for(i=0;i<M;i++){P=Insert(P,rand()%SRAND);S=Insert(S,rand()%SRAND);}    X=P;Y=S;    printf("P链表<升序>:\n");for(i=0;i<M;i++){printf("%03d%c",X->data,(i+1)%10?' ':'\n');   X=X->Q;}printf("S链表<升序>:\n");for(i=0;i<M;i++){printf("%03d%c",Y->data,(i+1)%10?' ':'\n');   Y=Y->Q;}T=HB(P,S);printf("合并后的T链表<降序>:\n");for(i=0;i<2*M;i++){printf("%03d%c",T->data,(i+1)%10?' ':'\n');   T=T->Q;}return 0;}LB *HB(LB *A,LB *B){LB *pa=A,*pb=B,*pre=NULL,*C,*q; //pa 和pb 分别指向A,B 的当前元素while(pb||pa)   //pa pb 不都到结尾时{if(pb&&pa&&pa->data<pb->data||!pb)//当pa  pb 都没到头且pa->data<pb->data  或者 pb到头时{               //将A 的元素插入新表C=pa;       //C指向当前节点q=pa->Q;    //q保存当前节点的下一节点pa->Q=pre;    //pa的下一个节点指向prepa=q;          //pa更新到下一节点}else         //将B 的元素插入新表{C=pb;q=pb->Q;pb->Q=pre;pb=q;             }   pre=C;    //pre保存最新节点}return C; }LB *Insert(LB *head,int DATA)  //在已经按照升序排列的链表中插入节点值DATA 返回插入及热点之后的头指针{LB *R=head,*S=head,*temp=NULL;S=(LB *)malloc(sizeof(LB));if(!S)   //当新节点申请内存失败时{printf("申请内存失败,程序停止运行!\n");getchar();exit (0);}S->Q=NULL;  //若申请成功,则对新节点初始化 S->data=DATA;  if(!head)    //如果原链表为空,则蒋则将新节点置为头结点head=S;else        //否则 当原链表有节点时{while(R->data<DATA&&R->Q)  //当未找到合适的位置 且链表没有到末尾时{temp=R;           R=R->Q;    }if(R->data>=DATA)     //当找到合适的节点时{if(R==head)          //如果插入的节点在头结点head 之前时{S->Q=head;      //这个地方最好画一下图 如果不理解的话head=S;    }else{R=temp;     //否则 在中间的某个位置插入新节点 不懂就画图S->Q=R->Q;R->Q=S;}}else            //否则当链表直到末尾之前都没有找到合适的位置 则说明其应直接做尾节点R->Q=S;}return head;     //返回头结点}



1 0
原创粉丝点击