02-线性结构1 两个有序链表序列的合并——中国大学MOOC-陈越、何钦铭-数据结构-2017秋
2017-10-22 16:22
781 查看
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
函数接口定义:
其中List结构定义如下:
L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。
裁判测试程序样例:
输入样例:
输出样例:
下面就是自己编的代码:
错误(代码中标了**的就是犯错误的地方)没改之前的运行结果
错误改后运行结果:
总结:
函数接口定义:
List Merge( List L1, List L2 );
其中List结构定义如下:
typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */
L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。
裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表;空链表将输出NULL */ List Merge( List L1, List L2 ); int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
3 1 3 5 5 2 4 6 8 10
输出样例:
1 2 3 4 5 6 8 10 NULL NULL
下面就是自己编的代码:
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表;空链表将输出NULL */ List Merge( List L1, List L2 ); int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; } //读取一个链表 List Read() { ElementType N; ElementType data; scanf("%d",&N); // 创建一个线性链表 List L; List p; List L1; L = (List)malloc(sizeof(struct Node)); L1 = L; L1->Next = NULL; while(N--) { p = (List)malloc (sizeof(struct Node)); **scanf("%d",&data);** //之前在这里写的是 data =scanf("%d",&data); // 最后结果输出全是: //1 1 1 1 1 1 1 1 //NULL //NULL p-> Data = data; p-> Next = NULL; L1-> Next = p; L1 = p; } return L; } //打印链表 void Print( List L ) { List L1 = L->Next; if(L1 == NULL ) { printf("NULL\n"); return; } else { while(L1 != NULL) { printf("%d ",L1->Data); L1 = L1->Next; } printf("\n"); } } //将两个链表连接起来 List Merge( List L1, List L2 ) { List p1 = L1->Next; List p2 = L2->Next; // 建立一个新的链表 List L = (List)malloc (sizeof(struct Node)); L->Next = NULL; List L3 = L; while(1) { if(p1 != NULL && p2 != NULL) { if(p1->Data < p2->Data) { L3->Next = p1; p1 = p1->Next; } else { L3->Next = p2; p2 = p2->Next; } L3 = L3->Next; } else if(p1 != NULL) { L3->Next = p1; p1 = p1->Next; L3 = L3->Next; } else if(p2 != NULL) { L3->Next = p2; p2 = p2->Next; L3 = L3->Next; } else break; } //另一种方法 // **while(p1 != NULL || p2 != NULL)** //之前没有加循环,最后结果出了错误 // { // while(p1 != NULL) // { // L3->Next = p1; // p1 = p1->Next; // L3 = L3->Next; // } // while(p2 != NULL) // { // L3->Next = p2; // p2 = p2->Next; // L3 = L3->Next; // } // } L1->Next = NULL; L2->Next = NULL; L3->Next = NULL; return L; }
错误(代码中标了**的就是犯错误的地方)没改之前的运行结果
错误改后运行结果:
总结:
1. 通常对链表的操作通过新创建一个指针L3=L来操作链表的增删查找(头指针代表一个链表,其值不能改变)。 2. scanf()函数的用法是,如果输入成功,则返回值为1,如果输入失败,则返回值为0。data=scanf("%d",&data);是错误的。应该为:scanf("%d",&data);——低级错误
相关文章推荐
- 中国大学MOOC-陈越、何钦铭-数据结构-2017秋 02-线性结构4 Pop Sequence
- [数据结构]02-线性结构1 两个有序链表序列的合并
- 02-线性结构2 一元多项式的乘法与加法运算-中国大学MOOC-陈越、何钦铭-数据结构-2017秋
- 数据结构 02-线性结构1 两个有序链表序列的合并
- PAT数据结构_02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并 (15分)
- C 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并(15 分)
- 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- [PAT] 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并(15 point(s)) 【链表合并】
- 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并 4000