开天辟地的卷毛 2022-05-30 22:34 采纳率: 85.4%
浏览 77
已结题

用链表实现学生信息系统的问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAME_LEN 10
#define FILE_NAME "学生成绩.txt"
#pragma warning(disable:4996)

typedef struct {
    char name[NAME_LEN + 1];//姓名
    char number[100];              //手机号码
    char gender[100];             //性别
    char n_place[100];            //籍贯
    char birthday[100];           //生日
    char p_outlook[100];          //政治面貌
    char native[100];              //民族
} student;                    //用于存储单个学生的信息

typedef struct node {
    student stu;        //数据域,存储学生信息
    struct node *next;    //指针域,指向下一个节点
} studentNode;            //学生节点

typedef struct {
    studentNode *head;    //头指针
    studentNode *tail;    //尾指针
    int count;            //学生节点总数
} studentList;            //学生链表

void initialize(studentList *L);//初始化链表,创建头节点
void enter(studentList *L);        //录入链表
void display(studentList *L);    //输出链表
void find(studentList *L);        //查找某节点
void modify(studentList *L);    //修改某节点
void sort(studentList *L);        //降序重新建表并输出
void write(studentList *L);        //写入文件,边写边释放空间
void read(studentList *L);        //读取文件,边读边建表

int main() {
    //互动界面
    printf("        **************学生信息管理系统**************\n");
    printf("        *  1.录入新的学生信息                      *\n");
    printf("        *  2.按姓名修改学生信息                    *\n");
    printf("        *  3.按姓名查询学生信息                    *\n");
    printf("        *  4.输出全部学生的成绩                    *\n");
    printf("        *  5.退出学生成绩管理系统                  *\n");
    printf("        ********************************************\n");
    printf("                                                      \n");
    //创建学生链表
    studentList *L = (studentList *)malloc(sizeof(studentList));
    //初始化学生链表
    initialize(L);
    //从文件里读取数据到链表
    read(L);
    //互动界面是用一个无限循环和一个switch写的
    while (1) {
        int code;
        printf("请输入你想进行的操作对应的数字: ");
        scanf("%d", &code);
        switch (code) {
            case 1:
                enter(L);
                break;
            case 2:
                modify(L);
                break;
            case 3:
                find(L);
                break;
            case 4:
                display(L);
                break;
            case 5:
                write(L);
                free(L->head);    //头节点被销毁
                free(L);        //链表被销毁
                return 0;
            default:
                printf("%d是无效的数字,请重新输入!\n\n", code);
                break;
        }
    }
    return 0;
}

void initialize(studentList *L) {
    //创建头节点
    studentNode *s = (studentNode *)malloc(sizeof(studentNode));
    s->next = NULL;
    //初始化链表:
    //头尾指针均指向头节点,初始长度为零
    L->head = s;
    L->tail = s;
    L->count = 0;
}

void enter(studentList *L) {
    //创建新节点
    studentNode *s = (studentNode *)malloc(sizeof(studentNode));
    //键入信息并存到新节点中
    printf("请输入学生姓名:");
    scanf("%s", s->stu.name);
    printf("请输入学生手机号:");
    scanf("%s", s->stu.number);
    printf("请输入性别:");
    scanf("%s", s->stu.n_place);
    printf("请输入生日:");
    scanf("%s", s->stu.birthday);
    printf("请输入政治面貌:");
    scanf("%s", s->stu.p_outlook);
    printf("请输入民族:");
    scanf("%s", s->stu.native);
    //若链表为空,将尾指针指向新节点
    if (L->head == L->tail) {
        L->tail = s;
    }
    //将新节点插进链表头部(头插法)
    s->next = L->head->next;
    L->head->next = s;
    L->count++;
    //输出互动信息
    printf("信息录入成功!\n\n");
}

这是部分代码,这个程序是链表的学生信息管理系统,目前调试添加学生信息功能,但是在头指针尾指针指向头节点的时候,指针s出现了乱码,所以导致在输入信息之后,学生手机号后面必回有乱码出现,我发现只有在将结构体(代码9-14)中的char数组全部改变为int数据类型的时候才会正常,但是这样又无法正常录入学生信息,我想问一下,有没有办法可以解决这个乱码的问题

  • 写回答

2条回答 默认 最新

查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 5月30日

悬赏问题

  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事: