沈阳航空航天大学习题的整理,仅供参考。
1.向有序链表中插入数据并输出最大和最小值
【问题描述】输入若干按升序排列的整数,建立单向链表,后输入一个整数,把该数按原顺序插入到原链表,输出新链表中数据的最大值和最小值并输出链表中所有数据。必须用链表完成,程序中不允许有数组出现。
【输入形式】输入若干按升序排列的整数以0作为结束,和待插入的整数。用单个空格隔开。
【输出形式】输出最大值和最小值及链表中的所有数据,数据之间用单个空格隔开。
【样例输入】1 3 4 5 6 7 8 0 2
【样例输出】8 1 1 2 3 4 5 6 7 8
【样例说明】
【评分标准】链表用完后空间要释放!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation failed.\n");
exit(0);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void insertNode(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL || (*head)->data >= data) {
newNode->next = *head;
*head = newNode;
}
else {
Node* current = *head;
while (current->next != NULL && current->next->data < data) {
current = current->next;
}
newNode->next = current->next;
current->next = newNode;
}
}
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
}
int main() {
Node* head = NULL;
int num;
while (scanf("%d", &num) == 1 && num != 0) {
insertNode(&head, num);
}
scanf("%d", &num);
insertNode(&head, num);
Node* temp = head;
int max = temp->data, min = temp->data;
while (temp != NULL) {
if (temp->data > max) {
max = temp->data;
}
if (temp->data < min) {
min = temp->data;
}
temp = temp->next;
}
printf("%d %d ", max, min);
printList(head);
return 0;
}
2.输出单链表倒数第K个结点值
【问题描述】输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个结点。
【输入形式】输入第一位为K值,其后接一串以空格分隔的整型值,用-1表示结束。
【输出形式】输出为倒数第K个结点的值,若无,则输出Not Found。
【样例输入】3 13 45 54 32 1 4 98 2 -1
【样例输出】4
【样例说明】K值为3,则输出链表倒数第3个结点的值为4。
【样例输入】5 13 4 -1
【样例输出】Not Found
【样例说明】K值为5,不存在倒数第5个结点,因此输出Not Found。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation failed.\n");
exit(0);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
Node* insertNode(Node* head, int data) {
Node* newNode = createNode(data);
if (head == NULL) {
head = newNode;
}
else {
Node* temp = head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
return head;
}
int findKthFromLast(Node* head, int k) {
if (head == NULL || k <= 0) {
printf("Not Found\n");
return -1;
}
Node* first = head;
Node* second = head;
for (int i = 0; i < k - 1 && second != NULL; i++) {
second = second->next;
}
if (second == NULL) {
printf("Not Found\n");
return -1;
}
while (second->next != NULL) {
first = first->next;
second = second->next;
}
return first->data;
}
int main() {
Node* head = NULL;
int k, data;
scanf("%d", &k);
while (1) {
scanf("%d", &data);
if (data == -1) {
break;
}
head = insertNode(head, data);
}
int result = findKthFromLast(head, k);
if (result != -1) {
printf("%d\n", result);
}
return 0;
}
3.对文件中存储的学生成绩进行统计
【问题描述】每个学生有包括学号、班级、姓名、成绩,从文件1.txt输入以上数据。
计算每个班级的平均成绩,以及所有学生的总平均成绩,计算90分以上,89-80分,79-70分,69-60分,60分以下的人数。将这些信息写入文件"2.txt"中。
【输入形式】从文件1.txt中读入学生信息
【输出形式】把统计好的成绩信息输出的2.txt文件中。
【样例输入】文件1.txt中内容,每位同学信息占一行,行内信息以单个空格分隔。
110 class1 li 90
120 class1 wang 60
130 class2 chen 75
140 class1 ma 80
150 class2 wei 65
【样例输出】文件2.txt中内容无空格,所有值取整数。第一行总平均成绩,以下各行为每个班的平均成绩,然后是全部学生中,90分以上人数,89-80人数,79-70人数,69-60人数,60分以下人数。
all ave 74
class1 ave 76
class2 ave 70
90 Above:1
89-80:1
79-70:1
69-60:2
60 Under:0
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int id;
char class_name[20];
char name[20];
int score;
} Student;
int main() {
FILE* fp1, * fp2;
fp1 = fopen("1.txt", "r");
fp2 = fopen("2.txt", "w");
if (fp1 == NULL || fp2 == NULL) {
printf("File opening error!\n");
return 1;
}
const int classMax = 10;
int total_sum = 0, total_count = 0;
int class_count[classMax] = { 0 };
int class_sum[classMax] = { 0 };
int grade_count[6] = { 0 };
Student student;
while (fscanf(fp1, "%d %s %s %d", &student.id, student.class_name, student.name, &student.score) != EOF) {
total_sum += student.score;
total_count++;
int class_index = atoi(student.class_name + strlen(student.class_name) - 1) - 1;
class_count[class_index]++;
class_sum[class_index] += student.score;
if (student.score >= 90) {
grade_count[0]++;
}
else if (student.score >= 80) {
grade_count[1]++;
}
else if (student.score >= 70) {
grade_count[2]++;
}
else if (student.score >= 60) {
grade_count[3]++;
}
else {
grade_count[4]++;
}
}
fclose(fp1);
fprintf(fp2, "all ave %d\n", total_sum / total_count);
if (class_count[4] > 0) {
fprintf(fp2, "class5 ave %d\n", class_sum[4] / class_count[4]);
}
for (int i = 0; i < 4; i++) {
if (class_count[i] > 0) {
fprintf(fp2, "class%d ave %d\n", i + 1, class_sum[i] / class_count[i]);
}
}
fprintf(fp2, "90 Above:%d\n", grade_count[0]);
fprintf(fp2, "89-80:%d\n", grade_count[1]);
fprintf(fp2, "79-70:%d\n", grade_count[2]);
fprintf(fp2, "69-60:%d\n", grade_count[3]);
fprintf(fp2, "60 Under:%d\n", grade_count[4]);
fclose(fp2);
return 0;
}
4.按要求对两个文件合并
【问题描述】编一个程序,合并两个已按递增排序的整数文件成一个按递增排序文件。
【输入形式】输入两个文件,文件名分别为1.txt和2.txt,在两个文件中分别输入已经排好序的整数,整数之间用单个空格隔开
【输出形式】输出按递增排好序的文件3.txt,输出文件中的整数用单个空格分隔
【样例输入】1.txt中内容为:1 3 4 5;2.txt中内容为:6 7 8
【样例输出】3.txt中内容为:1 3 4 5 6 7 8
【样例输入】1.txt中内容为:1 3 5;2.txt中内容为:2 4 6
【样例输出】3.txt中内容为:1 2 3 4 5 6
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void mergeFiles(const char* fileName1, const char* fileName2, const char* outputFileName) {
FILE* file1 = fopen(fileName1, "r");
FILE* file2 = fopen(fileName2, "r");
FILE* outputFile = fopen(outputFileName, "w");
if (file1 == NULL || file2 == NULL || outputFile == NULL) {
printf("Failed to open files\n");
return;
}
int num1, num2;
int readFromFile1 = fscanf(file1, "%d", &num1);
int readFromFile2 = fscanf(file2, "%d", &num2);
while (readFromFile1 == 1 && readFromFile2 == 1) {
if (num1 <= num2) {
fprintf(outputFile, "%d ", num1);
readFromFile1 = fscanf(file1, "%d", &num1);
}
else {
fprintf(outputFile, "%d ", num2);
readFromFile2 = fscanf(file2, "%d", &num2);
}
}
while (readFromFile1 == 1) {
fprintf(outputFile, "%d ", num1);
readFromFile1 = fscanf(file1, "%d", &num1);
}
while (readFromFile2 == 1) {
fprintf(outputFile, "%d ", num2);
readFromFile2 = fscanf(file2, "%d", &num2);
}
fclose(file1);
fclose(file2);
fclose(outputFile);
}
int main()
{
mergeFiles("1.txt", "2.txt", "3.txt");
return 0;
}
5.(指针做参数的函数定义)查找数组下标
【问题描述】从键盘输入数组元素数量 n 以及这 n 个元素;再输入 2 个数,找到这2个数在数组中的位置,即数组下标。若某个数在数组中不存在,输出 -1,注意若数组中存在多个待查找的数,要全部输出位置。
【输入形式】输入数组元素数量 n 以及这 n 个整数元素;再输入2个待查找的整数。
【输出形式】输出2个数的位置信息。
【样例输入】
3 56 85 41
27 58
【样例输出】
27 -1
58 -1
【样例输入】
4 101 25 5 444
5 101
【样例输出】
5 2
101 0
【样例输入】
6 2 6 8 8 6 8
8 6
【样例输出】
8 2 3 5
6 1 4
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
//输入数组数据,将实际输入的数据数量作为返回值返回
int input_data(int *number);
//输入要查找下标的两个数,进行查找,输出结果
void output_data(int *number,int n);
int main()
{
int n,x[20];
n=input_data(x);
output_data(x,n);
return 0;
}
int input_data(int *number) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &number[i]);
}
return n;
}
void output_data(int *number, int n) {
int target[2], index[2][10];
int count[2] = {0};
for (int i = 0; i < 2; i++) {
scanf("%d", &target[i]);
}
for (int i = 0; i < 2; i++) {
for (int j = 0; j < n; j++) {
if (number[j] == target[i]) {
index[i][count[i]] = j;
count[i]++;
}
}
}
for (int i = 0; i < 2; i++) {
if (count[i] == 0) {
printf("%d -1\n", target[i]);
} else {
printf("%d ", target[i]);
for (int j = 0; j < count[i]; j++) {
printf("%d ", index[i][j]);
}
printf("\n");
}
}
}
6.(指针做参数的函数定义)规格化数据
【问题描述】输入 10 个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:
①输入 10 个数; 函数原型声明:void input_data(int *number)
②进行处理; 函数原型声明:void handle_val(int *number)
③输出 10 个数。 函数原型声明:void output_data(int *number)
【输入形式】输入 10 个整数。
【输出形式】输出对换后的10个整数。
【样例输入】10 25 6 15 87 3 26 31 85 7
【样例输出】3 25 6 15 7 10 26 31 85 87
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
void input_data(int *number);
void handle_val(int *number);
void output_data(int *number);
int main()
{
int x[10];
input_data(x);
handle_val(x);
output_data(x);
return 0;
}
void input_data(int *number) {
for (int i = 0; i < 10; i++) {
scanf("%d", &number[i]);
}
}
// ②进行处理
void handle_val(int *number) {
int min_index = 0, max_index = 9;
for (int i = 1; i < 10; i++) {
if (number[i] < number[min_index]) {
min_index = i;
}
if (number[i] > number[max_index]) {
max_index = i;
}
}
// 将最小值与第一个数对换
int temp = number[0];
number[0] = number[min_index];
number[min_index] = temp;
// 将最大值与最后一个数对换
temp = number[9];
number[9] = number[max_index];
number[max_index] = temp;
}
// ③输出 10 个数
void output_data(int *number) {
for (int i = 0; i < 10; i++) {
printf("%d ", number[i]);
}
printf("\n");
}
7.创建并输出链表
【问题描述】从键盘输入一行字符,以 # 结束,建立链表,打印输出链表。
【输入形式】输入一行字符,以 # 结束。
【输出形式】输出 # 之前的字符串(注意空表输出情况)。
【样例输入】123456789#124
【样例输出】123456789
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(Node)
//用 typedef 将结构体改名字
typedef struct Node {
char data;
struct Node *next;
} Node;
Node *create();
void print(Node *p);
int main()
{
Node *head = NULL;
head = create();
print(head);
return 0;
}
Node* create() {
Node *head = NULL, *temp = NULL, *last = NULL;
char ch;
while ((ch = getchar()) != '#') {
temp = (Node*)malloc(sizeof(Node));
if (temp == NULL) {
printf("Memory allocation failed.\n");
return NULL;
}
temp->data = ch;
temp->next = NULL;
if (head == NULL) {
head = temp;
last = temp;
} else {
last->next = temp;
last = temp;
}
}
return head;
}
void print(Node *p) {
if (p == NULL) {
return;
}
while (p != NULL) {
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
8.删除链表中指定结点
【问题描述】输入链表 a,链表结点中包含学号、姓名,学号输入 -1,姓名随意代表一个链表输入结束。再输入待删除结点的学号 num,请编写删除链表中结点函数,从结点中删除学号为 num 的结点,并依次输出删除后的链表。若链表中不包含学号为 num 的结点,则先输出 no data,再依次输出链表结点。
【输入形式】输入链表 a 的数据和待删除结点的学号 num。其中,学号输入 -1,姓名随意代表一个链表输入结束。
【输出形式】输出删除后的新链表。
【样例输入】
101 Wang
102 Li
105 Zhang
106 Wei
-1 x
105
【样例输出】
101 Wang 102 Li 106 Wei
【样例输入】
101 Wang
102 Li
105 Zhang
106 Wei
-1 x
103
【样例输出】
no data 101 Wang 102 Li 105 Zhang 106 Wei
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(NODE)
//用 typedef 将结构体改名字
typedef struct node {
int num;
char name[20];
struct node *next;
} NODE;
NODE *Create_LinkList();
//读入学号,并删除指定学号的结点,
//成功删除返回正数,未找到学号返回负数。
int Delete_LinkList(NODE *head);
void Display_LinkList(NODE *head,int flag);
void Free_LinkList(NODE *head);
int main()
{
NODE *head = NULL;
int flag;
head = Create_LinkList();
flag=Delete_LinkList(head);
Display_LinkList(head,flag);
Free_LinkList(head);
return 0;
}
NODE* Create_LinkList()
{
NODE* head, *head1, * p1, * p2;
int n = 0;
head1= (NODE*)malloc(LEN);
head = NULL;
p1 = p2 = (NODE*)malloc(LEN);
scanf("%d %s",&p1->num,p1->name);
while (p1->num != -1)
{
n += 1;
if (n == 1)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
p1 = (NODE*)malloc(LEN);
scanf("%d %s", &p1->num, p1->name);
}
p2->next = NULL;
head1->next = head;
return head1;
}
int Delete_LinkList(NODE* head)
{
int x = 0;
scanf("%d", &x);
NODE* p;
p = head;
int flag = -1;//没找到时flag为-1
while (p->next != NULL)
{
if (p->next->num == x)
{
NODE* temp;
temp = p->next;
p->next = p->next->next;
free(temp);
flag = 1;
break;
}
p = p->next;
}
return flag;
}
void Display_LinkList(NODE *head,int flag)
{
NODE *p;
if(flag<0)
printf("no data ");
for (p = head->next; p != NULL; p = p->next)
printf ("%d %s ", p->num,p->name);
}
void Free_LinkList(NODE *head)
{
NODE *p, *q;
p = head;
while (p->next != NULL)
{
q = p->next;
p->next = q->next;
free (q);
}
free (head);
}
9.用指针和函数实现3个数排序
【问题描述】输入 3 个整数,按由小到大的顺序输出。指针使用部分要求定义函数 void swap(int *x, int *y),函数功能是 x 和 y 两个数互换。
【输入形式】输入 3 个整数。
【输出形式】按由小到大的顺序输出,每个数用一个空格分隔。
【样例输入】5 -1 6
【样例输出】-1 5 6
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
void swap(int *x,int *y);
int main()
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if (x > y) {
swap(&x, &y);
}
if (y > z) {
swap(&y, &z);
}
if (x > y) {
swap(&x, &y);
}
printf("%d %d %d",x,y,z);
return 0;
}
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}