学生管理系统——C语言单链表结构存储

这篇具有很好参考价值的文章主要介绍了学生管理系统——C语言单链表结构存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、设计内容

学生管理系统,是用c语言程序设计的一款简便软件项目,能对学生信息进行增删查改、排序、导入、导出,使用链表的结构存储。

二、功能需求

1.学生信息批量录入;
2.查询所有学生信息;
3.通过学号删除学生信息;
4.通过学号、姓名查询学生信息;
5.通过学号修改学生信息;
6.在表中某个位置插入学生信息;
7.导出学生信息文件;
8、导入学生信息表;
9.按学号、年龄排序;

三、单链表数据结构定义

// 存储学生的链表
typedef struct //定义每个人员信息结构体
{
  long int number;   //学号
  char name[50];     //姓名
  int age;           //年龄
  char sex[20];      //性别
  char birthday[50]; // 出生年月
  char addres[50];   //地址
  char phoneNum[50]; //电话
  char email[40];    // 邮箱
} DataType;

typedef struct link_stu // 定义链表
{
  DataType stuInfo;
  struct link_stu *next; // 指向下一个学生数据
} ListNode;

四、系统功能模块

1.创建学生表批量录入学生信息

ListNode *create()
{
  int i;
  ListNode *s, *r, *Ls = (ListNode *)malloc(sizeof(ListNode));
  Ls->next = NULL;
  r = Ls; //尾节点

  printf("请输入学生人数:");
  scanf("%d", &num);
  for (i = 1; i <= num; i++)
  {
    s = (ListNode *)malloc(sizeof(ListNode)); // 新建学生结点
    printf("请输入第%d个学生\n", i);
    printf("学号:");
    scanf("%ld", &s->stuInfo.number);
    printf("姓名:");
    scanf("%s", &s->stuInfo.name);
    printf("年龄:");
    scanf("%d", &s->stuInfo.age);
    printf("性别:");
    scanf("%s", &s->stuInfo.sex);
    printf("出生年月:");
    scanf("%s", &s->stuInfo.birthday);
    printf("地址:");
    scanf("%s", &s->stuInfo.addres);
    printf("电话:");
    scanf("%s", &s->stuInfo.phoneNum);
    printf("邮箱:");
    scanf("%s", &s->stuInfo.email);

    s->next = Ls->next;
    Ls->next = s;
  }
  printf("录入结束,请按任意键结束!\n");
  getch();
  return Ls;
}

2.查询所有学生信息

// 查询所有学生信息
void searchAll(ListNode *L)
{
  ListNode *p = L->next;
  if (p == NULL)
  {
    printf("学生表为空,请先创建学生表,按任意键继续!\n");
    getch();
  }
  else
  {

    printf("———————————————————所有学生信息———————————————————————————————————————————\n");
    printf("|   学号    姓名    年龄   性别     出生年月    地址      电话       邮箱  |\n");
    printf("————————————————————————————————————————————————————————————————————————\n");
    while (p != NULL)
    {

      printf("%6ld  %6s   %5d  %5s %9s %9s %9s %9s\n", p->stuInfo.number, p->stuInfo.name, p->stuInfo.age,
             p->stuInfo.sex, p->stuInfo.birthday, p->stuInfo.addres, p->stuInfo.phoneNum,p->stuInfo.email);
      p = p->next;
    }
    printf("显示结束,请按任意键继续!\n");
    getch();
  }
}

3.通过学号删除学生信息

//根据学号删除学生信息
ListNode *deleNode(ListNode *head)
{

  ListNode *v1, *v2;
  long number;
  if (head == NULL)
  {
    printf("您操作的通讯录此时为空,不能进行删除操作!");
  }
  printf("请输入要删除的学生的学号:");
  scanf("%ld", &number);

  for (v2 = v1 = head; v1 != NULL;)
  {
    if (v1->stuInfo.number == number)
    {
      if (head->stuInfo.number == number) //对头指针特殊处理
      {
        v1 = head;
        head = head->next;
        free(v1);
        printf("该学生已成功删除!\n");
        v2 = v1 = head;
        return head;
      }
      else
      {
        v2->next = v1->next;
        free(v1);
        v1 = v2->next;
        printf("该学生已成功删除!\n");
        return head;
      }
    }
    else
    {
      v2 = v1;
      v1 = v1->next;
    }
  }
  printf("你要删除的学生不存在\n\n");
  return head;
}

4.通过学号、姓名查询学生信息

// 根据学号、姓名查询学生信息
void seleById(ListNode *head_linkman)
{
  ListNode *p1, *p2;
  char name[20];
  long number;
  int nM, num;
  if (head_linkman == NULL)
  {
    printf("您操作的学生表此时为空,不能进行查询操作!");
  }
  p1 = head_linkman;
  nM = 0;
  if (p1 != NULL)
  {

    
    printf("1.选择学号查询\n");
    printf("2.选择姓名查询\n");
    printf("请输入查询方式:\n");
    scanf("%d", &num);
    if (num == 1)
    {
      printf("请输入要查询的学生的学号:");
      scanf("%ld", &number);
    }
    else if (num == 2)
    {
      printf("请输入要查询的学生的姓名:");
      scanf("%s", &name);
    }
    else
    {
      printf("输入无效!!");
    }

    while (p1->stuInfo.number != number && p1->next != NULL)
    {
      p1 = p1->next;
    }
    if (p1->stuInfo.number == number || strcmp(p1->stuInfo.name, name) == 0)
    {
      nM++;
      printf("———————————————————所有学生信息———————————————————————————————————————————\n");
      printf("|   学号    姓名    年龄   性别     出生年月    地址      电话       邮箱  |\n");
      printf("————————————————————————————————————————————————————————————————————————\n");
      printf("%6ld  %6s   %5d  %5s %9s %9s %9s %9s\n", p1->stuInfo.number, p1->stuInfo.name, p1->stuInfo.age,
            p1->stuInfo.sex, p1->stuInfo.birthday, p1->stuInfo.addres, p1->stuInfo.phoneNum,p1->stuInfo.email);
    }

    if (nM == 0)
    {
      printf("该学生未录入!\n");
    }
    printf("显示结束,请按任意键继续!\n");
    getch();
  }
    
}

5.通过学号修改学生信息

// 根据学号修改学生信息
void updata(ListNode *L)
{

  ListNode *p;
  long number;
  int nM;
  if (L == NULL)
  {
    printf("您操作的学生表此时为空,不能进行修改操作!");
  }
  p = L;

  if (p != NULL)
  {

    printf("请输入要修改的学生的学号:");
    scanf("%ld", &number);
    while (p->stuInfo.number != number && p->next != NULL)
    {
      p = p->next;
    }
    if (p->stuInfo.number == number)
    {
      printf("姓名:");
      scanf("%s", &p->stuInfo.name);
      printf("年龄:");
      scanf("%d", &p->stuInfo.age);
      printf("性别:");
      scanf("%s", &p->stuInfo.sex);
      printf("出生年月:");
      scanf("%s", &p->stuInfo.birthday);
      printf("地址:");
      scanf("%s", &p->stuInfo.addres);
      printf("电话:");
      scanf("%s", &p->stuInfo.phoneNum);
      printf("邮箱:");
      scanf("%s", &p->stuInfo.email);
      printf("修改成功!\n");
    }

    printf("显示结束,请按任意键继续!\n");
    getch();
  }
}

6.查找第i个节点的存放地址

// 查找第i个节点的存放地址
ListNode *find(ListNode *head, int i)
{

  int j = 0;
  ListNode *p = head;
  if (i < 0)
  {
    printf("\n带头结点的单链表中不存在第%d个结点!\n", i);
    return NULL;
  }
  else if (i == 0)
    return p;         /*此时p指向的是头结点*/
  while (p && i != j) /*没有查找完并且还没有找到*/
  {
    p = p->next;
    j++; /*继续向后(左)查找,计数器加1*/
  }
  return p; /*返回结果,i=0时,p指示的是头结点*/
}

7.表中某个位置插入学生信息

// 在第i个结点新增学生信息
ListNode *insert(ListNode *head)
{
  int i;
  printf("请输入学生要插入位置:");
  scanf("%d", &i);
  ListNode *p, *q;
  q = find(head, i - 1); /*查找带头结点的单链表中的第i个结点*/
                         /*i=0,表示新结点插入在头结点之后,此时q指向的是头结点*/
  if (!q)                /*没有找到*/
  {
    printf("\n带头结点的单链表中不存在第%d个结点!不能插入!\n", i);
    return head;
  }
  p = (ListNode *)malloc(sizeof(ListNode)); /*为准备插入的新结点分配空间*/
  printf("请输入要插入位置%d学生信息\n", i);
  printf("学号:");
  scanf("%ld", &p->stuInfo.number);
  printf("姓名:");
  scanf("%s", &p->stuInfo.name);
  printf("年龄:");
  scanf("%d", &p->stuInfo.age);
  printf("性别:");
  scanf("%s", &p->stuInfo.sex);
  printf("出生年月:");
  scanf("%s", &p->stuInfo.birthday);
  printf("地址:");
  scanf("%s", &p->stuInfo.addres);
  printf("电话:");
  scanf("%s", &p->stuInfo.phoneNum);
  printf("邮箱:");
  scanf("%s", &p->stuInfo.email);
  p->next = q->next; /*插入(1)*/
  q->next = p;       /*插入(2),当i=0时,由于q指向的是头结点,本语句等价于head>next=p */
  return head;
}

8.导出学生信息表文件

// 保存文件
void save(ListNode *hd)
{
  
  if (hd == NULL)
  {
    printf("链表为空,不能保存文件,请按任意键继续!\n");
    getch();
  }
  else
  {
  	char filename[15];
	char type[] = ".txt";
	char all[15];
  	printf("请输入保存的文件名:");
  	scanf("%s",filename);
    strcpy(all,filename);
    strcat(all,type);
    FILE *fp = fopen(all, "w");
    ListNode *p = hd->next;
    while (p != NULL)
    {
      fprintf(fp, "%ld %s %d %s %s %s %s %s\n", p->stuInfo.number, p->stuInfo.name, p->stuInfo.age, p->stuInfo.sex, 
      p->stuInfo.birthday, p->stuInfo.addres, p->stuInfo.phoneNum, p->stuInfo.email);
      p = p->next;
    }
    fclose(fp);
    printf("链表保存结束,请按任意键继续!\n");
    getch();
  }
}

9.导入学生信息表

// 导入学生数据
ListNode *loadFile(ListNode *head)
{
  long int number;   //学号
  char name[50];     //姓名
  int age;           //年龄
  char sex[20];      //性别
  char birthday[50]; // 出生年月
  char addres[50];   //地址
  char phoneNum[50]; //电话
  char email[40];    // 邮箱
  FILE *fp;
  char filename[15];
  char type[] = ".txt";
  char all[15];
  printf("请输入保存的文件名:");
  scanf("%s",filename);
  strcpy(all,filename);
  strcat(all,type);
  if ((fp = fopen(all, "r")) == NULL)
  {
    printf("文件打开失败!\n");
    return head;
  }

  if (head == NULL || head->next == NULL)
  {                                              // 如果链表为空
    head = (ListNode *)malloc(sizeof(ListNode)); // 创建一个头结点
    head->next = NULL;
  }

  ListNode *tail = head;
  while (tail->next != NULL)
  {
    tail = tail->next;
  }

  while (fscanf(fp, "%ld%s%d%s%s%s%s%s", &number, name, &age, sex, birthday, addres, phoneNum, email) != EOF)
  {
    ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
    newNode->stuInfo.number = number;
    strcpy(newNode->stuInfo.name, name);
    newNode->stuInfo.age = age;
    strcpy(newNode->stuInfo.sex, sex);
    strcpy(newNode->stuInfo.birthday, birthday);
    strcpy(newNode->stuInfo.addres, addres);
    strcpy(newNode->stuInfo.phoneNum, phoneNum);
    strcpy(newNode->stuInfo.email, email);
    newNode->next = NULL;

    if (tail == NULL)
    { // 如果链表为空,则将新节点作为头节点
      tail = newNode;
      head->next = tail;
    }
    else
    {
      tail->next = newNode;
      tail = newNode;
    }
  }

  fclose(fp);
  printf("导入数据成功,请按任意键继续!\n");
  getch();
  return head;
}

10.按学号、年龄排序

// 按学号或年龄排序
ListNode *Sort(ListNode *mylist, int num)
{

  if ((mylist->next == NULL) || (mylist->next->next == NULL))
  {
    return NULL;
  }

  ListNode *head, *pre, *cur, *next, *end, *temp;
  head = mylist;
  end = NULL;
  //从链表头开始将较大值往后沉
  while (head->next != end)
  {
    for (pre = head, cur = pre->next, next = cur->next; next != end; pre = pre->next, cur = cur->next, next = next->next)
    {
      if (num == 1)
      { // num=1时按学号排序
        //相邻的节点比较
        if (cur->stuInfo.number > next->stuInfo.number)
        {
          cur->next = next->next;
          pre->next = next;
          next->next = cur;
          temp = next;
          next = cur;
          cur = temp;
        }
      }
      if (num == 2)
      {
        if (cur->stuInfo.age > next->stuInfo.age)
        {
          cur->next = next->next;
          pre->next = next;
          next->next = cur;
          temp = next;
          next = cur;
          cur = temp;
        }
      }
    }
    end = cur;
  }
  return mylist;
}
  1. 主函数调用
void prin()
{
  printf("=====================================欢迎使用学生管理系统===============================\n");
  printf("||                                  1.创建学生表批量录入学生信息                      ||\n");
  printf("||                                  2.查询所有学生信息                                ||\n");
  printf("||                                  3.通过学号删除学生信息                            ||\n");
  printf("||                                  4.通过学号、姓名查询学生信息                      ||\n");
  printf("||                                  5.通过学号修改学生信息                            ||\n");
  printf("||                                  6.表中某个位置插入学生信息                        ||\n");
  printf("||                                  7.导出学生信息表文件                              ||\n");
  printf("||                                  8.导入学生信息表                                  ||\n");
  printf("||                                  9.按学号、年龄排序                                ||\n");
  printf("||                                  10.退出系统!                                     ||\n");
  printf("========================================================================================\n");
  printf("请选择你的功能:");
}

void main()
{

  ListNode *ls = NULL;
  int number, num;
  while (1)
  {
	    prin();
	    scanf("%d", &number);
	    switch (number)
	    {
	    case 1: // 创建学生表批量录入学生信息
		      ls = create();
		      break;
	    case 2: // 查询所有学生信息
	          if (ls)
		      {
			        searchAll(ls);
		            break;
		      }
		      else
		      {
			        printf("学生表为空,请先创建学生表,按任意键继续!\n");
			        break;
		      }
		      
	    case 3: // 通过学号删除学生信息
		      if (ls)
		      {
			        ls = deleNode(ls);
			        break;
		      }
		      else
		      {
			        printf("学生表为空,请先创建学生表,按任意键继续!\n");
			        break;
		      }
	    case 4: // 通过学号查询学生信息
		      seleById(ls);
		      break;
	    case 5: // 通过学号修改学生信息;
		      if (ls)
		      {
			        updata(ls);
			        break;
		      }
		      else
		      {
			        printf("学生表为空,请先创建学生表,按任意键继续!\n");
			        break;
		      }
	    case 6: // 第i个结点新增学生信息);
		      if (ls)
		      {
			        ls = insert(ls);
			        break;
		      }
		      else
		      {
			        printf("学生表为空,请先创建学生表,按任意键继续!\n");
			        break;
		      }
	    case 7: // 导出文件
		      save(ls);
		      break;
	    case 8: // 导入文件
		      ls = loadFile(ls);
		      break;
	    case 9:
	    	  if(ls) {
		    	  printf("===========================================\n");
			      printf("1.按学号进行排序\n");
			      printf("2.按年龄进行排序\n");
			      printf("请选择排序的方式\n");
			      scanf("%d", &num);
			      ls = Sort(ls, num);
			      printf("=================排序后的学生信息=================\n");
			      searchAll(ls);
			      break;
			  } else {
			  	  printf("学生表为空,请先创建学生表,按任意键继续!\n");
			      break;
			  }
		     
	    case 10: // 退出系统!
		      printf("退出系统!");
		      exit(0);
	    default:
	          break;
    }
  }
}

Tip:该系统是数据库结构基于C语言的一个课堂实训有很多不足之处,看到这的小伙伴请自己注意哦!文章来源地址https://www.toymoban.com/news/detail-784077.html

到了这里,关于学生管理系统——C语言单链表结构存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于C语言的数据结构课程设计(学生管理系统、停车场管理、家谱管理、校园导航系统)

    一、设计目的 本课程设计是软件工程学生的必修课程,数据结构与算法课程设计既是一门基础课程,又是一门实践性课程。 通过本实训课程的学习和训练,使同学学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据逻辑结构和存储结构,以及相应的运

    2024年02月09日
    浏览(62)
  • 用单链表实现学生信息管理系统(7.23周末作业)

    结构体定义: 功能函数: 1.申请结点 2.创建链表 3.链表判空 4.遍历学生信息 5.尾插法添加学生信息 6.根据姓名查找学生信息 7.根据学号查找学生信息 8.根据姓名删除学生信息 9.根据学号删除学生信息 10.根据学生姓名修改学生信息 11.根据学生学号修改学生信息 12.按学号将学生

    2023年04月20日
    浏览(35)
  • 使用c/c++语言写一个简单的学生信息管理系统(使用结构体数组,包含文件储存,文件读取等)

    使用c/c++开发的一个简单学生信息管理系统,功能如图所示: 选择不同的数字后可以选择不同的功能使用 在刚开始运行系统时会进行一个系统暂停,使用了windows函数库里面的system(\\\"pause\\\"),暂停系统有助于保护系统稳定性,防止系统出现闪屏等意外情况导致闪退等,并且使用了

    2024年02月09日
    浏览(46)
  • 数据结构——基于单链表实现通讯管理系统

    这个通讯录是基于单链表实现的,关于单链表,之前已经做过完整的实现方法——数据结构——单链表(C语言版) 用单链表实现的通讯录其实和用顺序表实现的通讯录类似,可以参考该文章——基于动态顺序表的应用——通讯录 完成该通讯录需要引进经过修改后的单链表的

    2024年04月14日
    浏览(59)
  • 【数据结构之线性表】单链表实现图书管理系统

            本次实验是在DEV C++软件上进行实现的。语言采用的是c++语言,但在整体上与c语言大致相似(不管用什么语言实现,思想是不变的)。         此次实现的整体思路:首先定义图书这个抽象数据类型,并且定义节点抽象数据类型(根据这些抽象数据类型对下面的数

    2024年02月08日
    浏览(41)
  • 用C语言实现一个学生信息管理系统,学生基本信息包括学号、姓名、三门课成绩以及个人平均成绩,有不超过70个学生的数据,要求能够建立学生基本信息(结构体数组)、按学号查询学生基本信息、计算学生个人平均成绩...

    下面是一种使用 C 语言实现学生信息管理系统的方案: 首先,定义结构体存储学生的基本信息,其中包括学号、姓名、三门课成绩和平均成绩。例如: 然后,定义结构体数组来存储最多70个学生的信息。 接下来,可以编写函数来实现各种功能。例如,可以定义函数来建立学

    2024年02月03日
    浏览(61)
  • 数据结构设计--学生信息管理系统

    目录 1.环境 2.知识图 3.程序的功能 4.程序的源代码 vs code 快排+哈希 (1)程序中的数据存储到文件中。 (2) 录入学生成绩,格式如下: (学号(12位) 、姓名、性别、专业、班级、课程成绩(5门课程),总分)其中,总分通过程序计算求得。 (3)输出所有学生成绩。 (a)按某门课程成绩降序

    2024年02月04日
    浏览(50)
  • 数据结构--学生通讯录管理系统

    文章目录 一、问题描述 二、系统功能设计 三、各个代码部分 四、整体代码及其运行 五、总结 学生通讯录管理系统--C语言实现 在现实中,用学号和姓名来记录学生需要花费大量的纸质材料,并且出现容易丢失、查找困难等问题。 “学生通讯管理系统”是为了帮助老师、同

    2024年02月11日
    浏览(59)
  • 数据结构课程设计:学生成绩管理系统

    目  录 第一章   需求分析 第二章 概要设计 第三章 详细设计 第四章 测试报告 第五章 安装及使用 第六章 项目总结 第七章 源码 一.需求分析        学生成绩管理是一个学校不可缺少的部分,它的内容对于学校的管理者和学生以及学生家长来说都至关重要,所以一个良好

    2024年02月02日
    浏览(70)
  • C语言——学生信息管理系统

    目录 功能展示 界面展示  所有功能模块: 功能1:菜单模块(显示功能菜单) 功能2:增加学生信息 功能3:输出学生信息(查看所有学习信息) 功能4:修改学生信息 功能5:删除学生信息 功能6:查询单个学生信息 功能7:排序学习信息(按照学号升序排序) 功能8:退出管

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包