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
- C语言数据结构 链表的合并
- C语言-数据结构-链表合并无需输入结点
- 数据结构(c语言版)链表的实现以及合并
- 基于c语言严蔚敏版的数据结构—非递减线性表的合并
- c语言数据结构中两个有序链表合并为一个新链表
- C语言实现数据结构的链表
- 数据结构 链表的实现(C语言)
- 递归合并有序链表C语言
- 【C语言】合并,排序两个链表
- C语言:非减链表的合并
- C语言的数据结构
- C语言的数据结构
- C语言的数据结构
- 数据结构 链表合并
- 数据结构算法2.2 链表的合并
- 《数据结构》2.1递增链表的合并
- 1465 数据结构:有序链表的合并
- C语言数据结构_链表的实现
- 2-SAT
- 360笔试题(2016年)—找出第一个出现一次的字符
- python3的urlretrieve使用方法
- Linux入门——适合初学者
- sicily可供练习题-1145. 校门外的树
- C语言数据结构 链表的合并
- ngx_http_enhanced_memcached_module
- addLoadEvent.js
- [面试][架构] 集群有哪几种?
- Java之控制台输入值
- Android 平台上的秒级编译方案
- Android 平台上的秒级编译方案
- 推荐两个比较值得参考的go开源项目列表
- Android Studio 写出你的第一个Activity