1. 设有以下结构体类型: struct STUDENT //学生结构体定义 { char id[11];//学号 char name[21];//姓名 char sex[4];//性别 char className[31];//班级 struct STUDENT *next;//指向下一个学生结构体的指针 }; 利用上述结构体类型创建链表。从文件“students.txt”(请放在源代码同目录下)中读入学生信息(每行一个学生),并保存在链表节点中(一个学生就是一个节点)。最后按照下面的格式把所有学生的信息依次写入一个新文件“output.txt”中(注意有表头标题行,并且每列左对齐): 学号 姓名 性别 班级 111 白展堂 男 计应1班 116 张三丰 男 计应2班 118 赵敏 女 软件1班
时间: 2023-12-03 12:47:06 浏览: 175
以下是实现代码:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LEN_ID 11
#define MAX_LEN_NAME 21
#define MAX_LEN_SEX 4
#define MAX_LEN_CLASS_NAME 31
struct STUDENT {
char id[MAX_LEN_ID];
char name[MAX_LEN_NAME];
char sex[MAX_LEN_SEX];
char className[MAX_LEN_CLASS_NAME];
struct STUDENT *next;
};
int main() {
struct STUDENT *head = NULL, *tail = NULL;
FILE *fp, *output;
char filename[] = "students.txt";
char outputFilename[] = "output.txt";
char buf[MAX_LEN_ID + MAX_LEN_NAME + MAX_LEN_SEX + MAX_LEN_CLASS_NAME + 4]; // 4 为分隔符和换行符的长度
// 读入学生信息并创建链表
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Error opening file %s\n", filename);
return 1;
}
while (fgets(buf, MAX_LEN_ID + MAX_LEN_NAME + MAX_LEN_SEX + MAX_LEN_CLASS_NAME + 4, fp) != NULL) {
// 读入一行学生信息
struct STUDENT *p = (struct STUDENT*)malloc(sizeof(struct STUDENT));
sscanf(buf, "%s %s %s %s", p->id, p->name, p->sex, p->className);
p->next = NULL;
if (head == NULL) {
head = p;
tail = p;
} else {
tail->next = p;
tail = p;
}
}
fclose(fp);
// 写入学生信息
output = fopen(outputFilename, "w");
if (output == NULL) {
printf("Error opening file %s\n", outputFilename);
return 1;
}
fprintf(output, "%-10s %-20s %-3s %s\n", "学号", "姓名", "性别", "班级");
struct STUDENT *p = head;
while (p != NULL) {
fprintf(output, "%-10s %-20s %-3s %s\n", p->id, p->name, p->sex, p->className);
p = p->next;
}
fclose(output);
// 释放链表空间
p = head;
while (p != NULL) {
struct STUDENT *q = p->next;
free(p);
p = q;
}
return 0;
}
```
在上面的代码中,我们首先定义了一个结构体类型 `STUDENT`,它包含学号、姓名、性别、班级和指向下一个学生结构体的指针。然后我们读入文件中的学生信息并创建链表,最后按照给定的格式写入到输出文件中。
注意,我们使用 `fgets` 函数从文件中一行一行地读入学生信息,然后使用 `sscanf` 函数将读入的字符串解析成学生结构体中的各个字段。在写入输出文件时,我们使用了 `%10s`、`%-20s` 和 `%3s` 等格式化字符串,它们分别表示输出字符串的最大宽度和左对齐或右对齐等格式化选项。最后,我们记得释放链表中的空间。
阅读全文