C程序综合训练随堂考试(2021年5月27日)全网最详细的注释
一到这种PTA考试就掉链子,不是写不出来,好像一在PTA上考试人就好像是傻了,好几次都是这种情况,考完后写个题解吧。
百分之百原创!个人觉得代码很完美,很健康!
同时 ,有些代码直接交到pta上肯定不会通过,但是bug倒是没有,只不过代码是按照题意完全自己构建的,读者如果理解我的想法,很快就可以写出来对应的答案代码!希望读者自己体会一下!
6-1 统计专业人数 (15 分)
题目大意
给一个存有学生学号的链表,统计含有特点特征的节点个数
解题思路
从头到尾遍历链表,添加一个变量来计数即可,较为简单
代码
int countcs( struct ListNode *head )
{
int count=0;
while(head!=NULL)
{
if(head->code[1]=='0'&&head->code[2]=='2') ++count;
head=head->next;
}
return count;
}
6-2 删除单链表偶数节点 (20 分)
题目
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
struct ListNode {
int data;
struct ListNode *next;
};
函数接口定义:
struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
函数createlist
从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数deleteeven
将单链表head
中偶数值的结点删除,返回结果链表的头指针
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *head;
head = createlist();
head = deleteeven(head);
printlist(head);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 2 2 3 4 5 6 7 -1
输出样例:
1 3 5 7
解题思路
首先是 这个创建链表,PTA的这种用来结束输入的方法的确有点复杂的,而且这些出题老师都喜欢这种用输入特定输入来结束输入,当时我被搞得… 一直在思考如何设计一个完美的代码架构可以解决特殊情况,比如第一个输入就是-1的时候,可能是上午没睡醒,这个问题想了大半天,晚上在宿舍写的时候,轻松秒杀。个人感觉晚上思路很清晰,看来晚上很适合写代码。
主要的思路都在代码里面了,写了详细的注释,个人觉得代码比较完美,比其他的好理解多了,当然这是百分之八原创的;
因为考试之后没有办法提交,只能自己测试了,我自己写的所有代码如下:
代码
#include<cstdio>
#include<cstdlib>
using namespace std;
struct List
{
int data;
List *next;
};
List *CreateList();
void ReadList(List *head);
List *DeleteOddnode(List *head);
int main()
{
List *head=CreateList();
printf("这是刚刚创建的链表:");
ReadList(head);
head=DeleteOddnode(head);
printf("这是经过处理后的链表:");
ReadList(head);
return 0;
}
List *CreateList()
{
int input;
scanf("%d",&input);
if (input==-1) return nullptr; //特判直接输入-1的情况
List *head=(List *) malloc(sizeof(List));//如果没有输入-1,就创建第一个结点
List *result=head; //并且记住这个结点,因为head结点要去迭代
head->data=input; //把数据赋值
while(scanf("%d",&input)&&input!=-1) //直接在入口判断输入
{
head->next=(List *) malloc(sizeof(List));//直接创建一个新的结点并赋值给head的下一个结点
head=head->next;//然后head进行迭代
head->data=input;//把输入赋值给head的data
head->next= nullptr;//这个很重要,因为没有对结构体进行初始化,所以next默认不是nullptr,一定要置空
//估计当时就是这里被卡了
}
return result;
}
void ReadList(List *head)
{