【链表、文件】习题

沈阳航空航天大学习题的整理,仅供参考。

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;
}
  • 28
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lnk_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值