两个有序链表序列的合并 PAT
来源:互联网 发布:日语汉字注音软件 编辑:程序博客网 时间:2024/06/07 18:31
关于这道题按照我最开始的思路写下去遇到了两个问题。
问题一:
我并没有先创建一个链表就直接调用了Insert()功能,导致我自己赋值的链表list1 list2一直未赋初值,编译时报错list1 list2未赋值后,我给初值NULL运行到Insert()内部也会报错 这里贴错误代码
int main(){ int a[]={1,3,5,7,9}; int b[]={2,4,6,8,10}; List list1=NULL,list2=NULL,list3=NULL; for(int i=0;i<5;i++) { Insert(a[i],list1); Insert(b[i],list2); } Merge(list1,list2,list3); prin(list3);}void Insert(Element x,List L){ List Next; Next=(List)malloc(sizeof(struct Node)); if(Next==NULL) { printf("error"); } Next->Date=x; Next->Link=L->Link; L->Link=Next;}因为如果我给NULL,运行到insert内部,Next->Link = L->Link; 这句中,L是NULL(主函数中Insert(a[i], list1);调用时list1为NULL),你去访问 L->Link 自然导致崩溃。
后改进算法,加入链表创建函数,出现问题二
问题二:
输出发现顺序是倒的,也就是10 9 8 7这样的顺序,思考后发现如果是上边的Insert函数执行的是插入功能,每次一个新的结点都会被插入到链表L头结点后的位置,因此改进算法,完整代码如下所示
#include "stdafx.h"#include "stdio.h"#include<stdlib.h> typedef int Element ;typedef struct Node *List;struct Node{Element Date;List Link;};List Merge(List list1,List list2,List list3);void Insert(Element x,List L);void prin(List l);List InitList();int main(){int a[]={1,3,5,7,9};int b[]={2,4,6,8,10};List list1,list2,list3;list1=InitList();list2=InitList();list3=InitList();for(int i=0;i<5;i++){Insert(a[i],list1);Insert(b[i],list2);}//prin(list1);Merge(list1,list2,list3);prin(list3);}void Insert(Element x,List L){List temp;temp=L;//这里应该是L的指针指向的地址赋给了temp,所以并不需要传出temp,因为temp指的正是L;while(temp->Link!=NULL){temp=temp->Link;//加入的循环会一直到尾部再进行插入}List Next;Next=(List)malloc(sizeof(struct Node));if(Next==NULL){ printf("error");
return;}Next->Date=x;Next->Link=temp->Link;temp->Link=Next;}List Merge(List list1,List list2,List list3){List temp1=list1->Link;List temp2=list2->Link;while(temp1&&temp2){if(temp1->Date<temp2->Date){ list3->Link=temp1; temp1=temp1->Link;list3=list3->Link;}else{ list3->Link=temp2; temp2=temp2->Link;list3=list3->Link;}}while(temp1!=NULL){list3->Link=temp1;temp1=temp1->Link;list3=list3->Link;}while(temp2!=NULL){list3->Link=temp2;temp2=temp2->Link;list3=list3->Link;} list1->Link=NULL; list2->Link=NULL; list3->Link=NULL; return list3; }void prin(List l){l=l->Link;while(l){printf("%d\t",l->Date);l=l->Link;}}List InitList(){List l;l=(List)malloc(sizeof(struct Node));if(l!=NULL)l->Link=NULL;return l;}
以上就是我的代码,如有错误,劳烦指出,感激不尽! 阅读全文
0 0
- PAT 两个有序链表序列的合并
- 两个有序链表序列的合并 PAT
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 两个有序链表序列的合并
- 浙江大学PAT上机题解析之2-11. 两个有序链表序列的合并
- 浙大PAT 2-11. 两个有序链表序列的合并 (解题思路)
- PAT 2-11 两个有序链表序列的合并(C语言实现)
- pat(A)2-11. 两个有序链表序列的合并
- SQLite学习手册(锁和并发控制)
- n皇后问题
- springmvc映射的牛头不对马嘴的原因
- Mac系统安装Lua
- 000032:将两个数相加的结果输出
- 两个有序链表序列的合并 PAT
- Xcode下载低版本iOS系统模拟器进行调试
- 恶补系列之操作系统——内核态与用户态
- c语言数据类型及printf
- 图邻接表数组存储
- SQLite学习手册(实例代码<一>)
- docker service create error
- Java-jsp表单提交整个table数据到后台
- 浏览器后退刷新