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;
}
相关文章
|
3月前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
1105 6
|
4月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
108 5
|
4月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
211 4
|
5月前
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
5月前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
48 0
|
5月前
|
C语言
C语言链式结构之有头单链表再封装写法
本文介绍了如何使用C语言对有头单链表进行封装,包括节点的创建、链表的初始化、数据的插入和删除,以及链表的打印等功能。
41 1
|
5月前
|
C语言
C语言结构体链式结构之有头单链表
文章提供了一个C语言实现的有头单链表的完整代码,包括创建链表、插入、删除和打印等基本操作。
67 1
|
5月前
|
测试技术 C语言
单链表之无头链表(C语言版)
本文详细介绍了使用C语言实现无头单链表的方法,包括节点和链表结构的定义、链表的创建与销毁、节点的插入与删除,以及链表的打印等功能。文章通过具体的代码示例,展示了如何在无头链表中进行头插法、尾插法、自定义位置插入和删除,以及如何清空和销毁链表。
81 0
单链表之无头链表(C语言版)
|
4月前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
147 0
|
5月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
65 0