C语言学生信息管理系统链表实现

简介: C语言学生信息管理系统链表实现

效果图



全部源代码


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Student {                                                     //通过结构体输入学生信息
  long num;
  char name[20];
  float score[3];
  //float aver;
  struct Student *next;
};
int main(void) {                                                     //主函数
  void Window();
  void Choose();
  Window();                                                        //进入首页面 
  Choose();                                                        //程序控制台 
}
void Window() {                                                      //菜单界面
  printf("-学生信息管理系统-\n");
  printf(" ---1、初始化信息---\n");
  printf(" ---2、存入文件---\n");
  printf(" ---3、增加信息---\n");
  printf(" ---4、改动信息---\n");
  printf(" ---5、删除信息---\n");
  printf(" ---6、查询信息---\n");
  printf(" ---7、显示信息---\n");
  printf(" ---0、退出系统---\n");
  printf("-非常感谢您的使用-\n");
  return;
}
void Choose() {
  struct Student *creat();
  void reserve(struct Student *head);
  void print(struct Student *head);
  void Add(struct Student *head);
  void Change(struct Student *head);
  void Find(struct Student *head);
  struct Student *Del(struct Student *head);
  struct Student *head, *head1;
  int button;
  printf("请选择您要进行的操作:\n");
  scanf("%d", &button);
  while (button) {
    if (button == 1) {
      head = creat();                                         //录入学生信息 
    }
    else if (button == 2) {
      reserve(head);                                        //将学生成绩以二进制的形式存放到文件中 
    }
    else if (button == 3) {
      Add(head);                                            //增加新的学生信息 
    }
    else if (button == 4) {
      Change(head);                                         //改动某个学生的信息 
    }
    else if (button == 5) {
      head = (Del(head));                                     //删除某个学生的信息 
      reserve(head);
    }
    else if (button == 6) {
      Find(head);                                           //查找某个学生的信息 
    }
    else if (button == 7) {
      print(head);                                          //显示文件中的学生信息 
    }
    else if (button == 0) {
      break;                                                //退出系统 
    }
    printf("请选择您要进行的操作:\n");
    scanf("%d", &button);
  }
}
struct Student *creat()
{                                                 //录入学生信息
  struct Student *head, *p1, *p2;
  int n = 1;
  printf("请输入学生的信息(输入所有信息为0时信息结束):\n");
  p2 = (struct Student *)(malloc(sizeof(struct Student)));
  p1 = p2;
  scanf("%ld%s%f%f%f", &p1->num, p1->name, &p1->score[0], &p1->score[1], &p1->score[2]);
  while(p1 -> num != 0 )
  {
    if(n==1)  // 赋初值
    {
      head = p1;
      n=0;
    } 
    else 
    {
      p2->next = p1;
    }
    p2 = p1;
    p1 = (struct Student *)(malloc(sizeof(struct Student)));
    scanf("%ld%s%f%f%f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);
  }
  p2->next=NULL;
  printf("录入信息已完成!\n");
  return head;
}
// 存入文件
void reserve(struct Student *head) 
{                                    //将学生信息以二进制的方式写到文件中
  FILE *fp;
  struct Student *p, *p1, stu[3];
  if ((fp = fopen("stud.txt", "wb")) == NULL) {
    printf("文件读写错误!");
    exit(0);
  }
  p = head;
  while (p != NULL) {
    if (fwrite(p, sizeof(sizeof(struct Student)), 1, fp) != 1) {                        //往文件中写内容和读取内容都必须要写这一步
    }
    p = p->next;
  }
  fclose(fp);
  printf("学生信息已读入文件!\n");
  return;
}
// 增加信息
void Add(struct Student *head) 
{
  void reserve(struct Student *head); ;
  struct Student *p1, *p2 = NULL, *pNew;
  long num;
  printf("请输入要插入的位置(前一个学生的学号):");
  scanf("%ld", &num);
  p1 = head;
  while (p1 != NULL)
  {
    if (p1->num == num) {
      p2 = p1->next;
      pNew = (struct Student *)(malloc(sizeof(struct Student)));
      printf("学号:");
      scanf("%ld", &pNew->num);
      printf("姓名:");
      scanf("%s", pNew->name);
      printf("成绩:");
      scanf("%f%f%f", &pNew->score[0], &pNew->score[1], &pNew->score[2]);
      p1->next = pNew;
      pNew->next = p2;
      break;
    }
    p1 = p1->next;
  }
  reserve(head);
  printf("增加学生信息成功!\n");
  return;
}
// 删除信息
struct Student *Del(struct Student *head) 
{
  struct Student *p, *p1;
  long num;
  printf("请输入要删除学生的学号:");
  scanf("%ld", &num);
  p = head;
  while (p != NULL) {
    if (head->num == num) {
      head = head->next;                                   //先看第一个是否是要删除的成绩
      free(p);
      break;
    }
    else {
      p1 = p;
      p1 = p->next;
      if (p1->num == num) 
      {
        p->next = p1->next;
        p = p1;
        free(p1);
        break;
      }
      p = p->next;
    }
  }
  printf("删除学生信息成功!\n");
  return head;
}
// 变更信息
void Change(struct Student *head) {                               //改动学生的成绩
  void reserve(struct Student *head);
  struct Student *p, newMessage;
  long Name;
  long num;
  char nam[20];
  printf("请输入要修改的学生学号:");
  scanf("%ld", &Name);
  p = head;
  while (p != NULL) {
    if (p->num == Name) {
      break;                                              //为什么会提示无效的数组,字符串之间能用==进行赋值吗??大傻瓜
    }
    p = p->next;
  }
  if (p == NULL) {
    printf("未找到该学生信息!\n");
    return;
  }
  printf("\n请输入新的信息:");
  printf("学号:");
  scanf("%ld", &num);
  printf("姓名:");
  scanf("%s", nam);
  p = head;
  while (p != NULL) {
    if (p->num == Name) {
      p->num = num;
      strcpy(p->name, nam);                                  //为什么会提示无效的数组,字符串之间能用==进行赋值吗??大傻瓜
    }
    p = p->next;
  }
  reserve(head);
  printf("修改学生信息成功!\n");
  return;                                                      //重新保存到文件中
}
// 查找信息
void Find(struct Student *head) 
{                                    //查找学生信息
  struct Student *p;
  float num;
  p = head;
  printf("请输入你要查找的学生的学号信息:");
  scanf("%f", &num);
  while (p != NULL) {
    if (p->num == num) {
      printf("学号:%ld  姓名:%s  成绩:%.2f %.2f %.2f ", p->num, p->name, p->score[0], p->score[1], p->score[2]);
      break;
    }
    p = p->next;
  }
  if (p == NULL) {
    printf("未找到该学生信息!\n");
  }
  printf("查找学生信息结束!\n");
  return;
}
// 显示信息
void print(struct Student *head) {                                   //从文件输出各个学生的信息
  printf("----------------学生信息----------------\n");
  printf(" 学号     姓名    语文    数学   英语\n");
  struct Student *p1;
  FILE *fp;
  fp = fopen("stud.txt", "rb");
  p1 = head;
  while (p1 != NULL) {
    if (fread(p1, sizeof(sizeof(struct Student)), 1, fp) != 0) {                        //将文件中的内容以二进制的方式读取并且显示到屏幕上
      printf(" %3ld%10s %6.2f   %5.2f   %5.2f\n", p1->num, p1->name, p1->score[0], p1->score[1], p1->score[2]);
    }
    p1 = p1->next;
  }
  fclose(fp);
  return;
}
相关文章
|
18天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
45 4
|
1月前
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
1月前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
26 0
|
1月前
|
C语言
C语言链式结构之有头单链表再封装写法
本文介绍了如何使用C语言对有头单链表进行封装,包括节点的创建、链表的初始化、数据的插入和删除,以及链表的打印等功能。
16 1
|
1月前
|
C语言
C语言结构体链式结构之有头单链表
文章提供了一个C语言实现的有头单链表的完整代码,包括创建链表、插入、删除和打印等基本操作。
22 1
|
18天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
38 0
|
1月前
|
测试技术 C语言
单链表之无头链表(C语言版)
本文详细介绍了使用C语言实现无头单链表的方法,包括节点和链表结构的定义、链表的创建与销毁、节点的插入与删除,以及链表的打印等功能。文章通过具体的代码示例,展示了如何在无头链表中进行头插法、尾插法、自定义位置插入和删除,以及如何清空和销毁链表。
32 0
单链表之无头链表(C语言版)
|
1月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
24 0
|
2月前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。
|
2月前
|
存储 测试技术 C语言
C语言实现链表的各种功能
本文详细介绍了如何使用C语言实现链表的各种功能,包括链表节点结构的定义与操作函数的实现。链表作为一种常用的数据结构,具有节点自由插入删除、动态变化等特点。文中通过`link_list.h`和`link_list.c`两个文件,实现了链表的初始化、插入、删除、查找、修改等核心功能,并在`main.c`中进行了功能测试。这些代码不仅展示了链表的基本操作,还提供了丰富的注释帮助理解,适合作为学习链表的入门资料。