第二周:线性结构
02-线性结构1 两个有序链表序列的合并 (15分)
这是一道C语言函数填空题,训练最基本的链表操作。如果会用C编程的话,一定要做;
代码
#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 Merge( List L1, List L2 ) {
List p1,p2,p3,T;
T = (List) malloc(sizeof(struct Node));
p3 = T;
p1 = L1->Next;
p2 = L2->Next;
while (p1 && p2) { //p1和p2都存在时
if (p1->Data <= p2->Data) {
p3->Next = p1;
p3 = p3->Next;
p1 = p1->Next;
} else {
p3->Next = p2;
p3 = p3->Next;
p2 = p2->Next;
}
}
if (p1) {//哪个还存在哪个后边的就全接到p3上
p3->Next = p1;
} else p3->Next = p2;
L1->Next = NULL;
L2->Next = NULL;
return T;
}测试点
测试点如下

02-线性结构2 一元多项式的乘法与加法运算 (20分)
这是一道C语言函数填空题,训练最基本的链表操作。如果会用C编程的话,一定要做;
思路
思路: 用带头结点的链表存储, 加法运算时: 若p1和p2(加法的两链表指针)指数比较后有一方较大,则将那一方直接放到p3中(尾插),然后较大方的指针后移,若指数相同则合并同类项后再插入,注意若系数为0则不将其插入直接两指针后移,最后若还有一方后边有则直接接到L3后,最后要检查L3为不为空,若为空则插入零多项式。 乘法运算时: 先用L1中的每一项乘L2的第一项得一个多项式,再用L2中从第二项开始的每一项乘以L1一整个多项式(边乘边比较并插入),或利用加函数(但我用的时候超时了…所以没用),最后也要检查L3为不为空,若为空则插入零多项式 ps:合并同类项的时候若系数合成0了,要删掉!
代码
测试点
测试点如下,虽然少但却卡了我半天2333

02-线性结构3 Reversing Linked List (25分)
根据某大公司笔试题改编的2014年春季PAT真题,不难,可以尝试;
题目大意
给定一个常量K和链表L,你应该反转L上每K个元素 例如,给定L为 1→2→3→4→5→6 如果K=3,然后必须输出 3→2→1→6→5→4 如果K=4,必须输出 4→3→2→1→5→6. 输入规格: 每个输入文件包含一个测试用例。对于每个样例 ,第一行包含第一个结点的地址、所有结点数N (≤10^5),一个正K (≤N)它是要反转的子列表的长度。 节点的地址是5位非负整数,NULL由-1表示。 然后是N行,每行描述如下格式:Address Data Next 其中Address是节点的位置,Data是整数,Next是下一个节点的位置。 输出规格: 对于每种情况,输出生成的有序链接列表。每个节点占据一条线,并且以与输入相同的格式打印。
示例输入:
00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218
示例输出:
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1
思路
用结构体存数据,用数组存储下标索引,翻转时只需翻转数组元素,可利用algorithm库中的reverse函数
代码
测试点
测试点如下

02-线性结构4 Pop Sequence (25分)
是2013年PAT春季考试真题,考察队堆栈的基本概念的掌握,应可以一试。
题目大意
给定一个可以保留最多M个数的堆栈M。放入N个数字1、2、3、...,N并随机弹出。你应该告诉给定的数字序列是否可能是堆栈的弹出序列。例如,如果M是5,N是7,我们可以从堆栈中获取1、2、3、4 、5、6、7,但不是3、2、1、7、5、6、4 输入规格: 每个输入文件包含一个测试用例。对于每个情况,第一行包含 3 个数字(所有数字不超过 1000) M(堆栈的最大容量),N(放入序列的长度),以及K(要检查的弹出序列数)。 接下来K行,每行包含一个含N个数字的弹出序列。行中的所有数字都用空格分隔。 输出规格:对于每个弹出序列,如果确实是堆栈的可能弹出序列,则用一行"YES"打印,如果不是,则打印为"否"。
示例输入:
5 7 5 1 2 3 4 5 6 7 3 2 1 7 5 6 4 7 6 5 4 3 2 1 5 6 4 3 7 2 1 1 7 6 5 4 3 2
示例输出:
YES NO NO YES NO
思路
处理每个序列时,先将1压入堆栈,每读入一个数x,将其与栈顶元素比较,若大于栈顶元素则压入直到x-1,若等于栈顶元素,直接弹出,若小于栈顶元素则直接false。若栈为空了,则需要压入一个数,若溢出了,则也是false
代码
测试点
测试点如下,一次过了

最后更新于
这有帮助吗?