首页 > 其他分享 >c语言链表-学生管理系统

c语言链表-学生管理系统

时间:2024-10-12 11:24:26浏览次数:6  
标签:head struct temp 管理系统 链表 num printf NULL 语言

include <stdio.h>

include <stdlib.h>

include <string.h>

// 定义结构体
struct STU {
char num[8]; // 学号
char name[5]; // 姓名
int score; // 成绩
};

// 定义链表
struct temp {
struct STU* s;
struct temp* next;
};

void add(struct temp** head); // 插入信息
void del(struct temp** head); // 删除信息
void mod(struct temp* head); // 修改信息
void find(struct temp* head); // 查找信息
void app(struct temp* head); // 显示所有信息

// 主函数
int main() {
struct temp* head = NULL;
while (1) {
printf("学生信息管理系统\n");
printf("请选择:\n");
printf("********** 1、输入信息\n");
printf("
2、删除信息\n");
printf("
3、修改信息\n");
printf("
4、查找信息\n");
printf("
5、显示全部信息\n");
printf("
**** 6、退出**************\n");
int choice = 0;
scanf_s("%d", &choice);
switch (choice) {
case 1:
add(&head);
break;
case 2:
del(&head);
break;
case 3:
mod(head);
break;
case 4:
find(head);
break;
case 5:
app(head);
break;
case 6:
return 0;
default:
printf("无效选项,请重新选择\n");
}
}
return 0;
}

// 增加
void add(struct temp** head) {
struct temp* new_node = (struct temp)malloc(sizeof(struct temp)); // 分配新节点内存
new_node->s = (struct STU
)malloc(sizeof(struct STU)); // 分配学生信息内存
new_node->next = NULL; // 初始化 next 指针为 NULL

printf("输入学号:\n");
scanf_s("%s", new_node->s->num, sizeof(new_node->s->num));  // num是数组名,不需要用符号&
printf("输入姓名:\n");
scanf_s("%s", new_node->s->name, sizeof(new_node->s->name)); // name是数组名,不需要用符号&
printf("输入成绩:\n");
scanf_s("%d", &new_node->s->score);

// 将新节点添加到链表末尾
if (*head == NULL) {
    *head = new_node;
}
else {
    struct temp* pr = *head;
    while (pr->next != NULL) {
        pr = pr->next;
    }
    pr->next = new_node;
}

}

// 删除
void del(struct temp** head) {
if (*head == NULL) {
printf("链表为空\n");
return;
}

char num[8] = { 0 };
printf("输入学号\n");
scanf_s("%s", num, sizeof(num));

struct temp* pr = NULL; // 用于追踪前一个节点
struct temp* p = *head;

while (p != NULL && strcmp(p->s->num, num) != 0) {
    pr = p;   // pr是p的前一个节点
    p = p->next;
}

if (p == NULL) {
    printf("未找到该学号的学生\n");
    return;
}

if (p == *head) {
    *head = p->next; // 如果删除的是头节点
    printf("删除成功\n");
}
else {
    pr->next = p->next; // 从链表中跳过要删除的节点
}
free(p->s); // 释放学生信息内存
free(p); // 释放节点内存
printf("删除成功\n");

}

// 修改
void mod(struct temp* head) {
if (head == NULL) {
printf("链表为空\n");
return;
}

char num[8] = { 0 };
printf("输入学号:\n");
scanf_s("%s", num, sizeof(num));

struct temp* p = head;
while (p != NULL && strcmp(p->s->num, num) != 0) {
    p = p->next;
}

if (p == NULL) {
    printf("未找到该学号的学生\n");
    return;
}

printf("选择修改的信息\n");
printf("1.学号\n");
printf("2.姓名\n");
printf("3.成绩\n");
printf("4.退出\n");
printf("**************************\n");
int c = 0;
scanf_s("%d", &c);

switch (c) {
case 1:
    printf("输入修改后的学号:\n");
    scanf_s("%s", p->s->num, sizeof(p->s->num));
    printf("修改成功\n");
    break;
case 2:
    printf("输入修改后的姓名:\n");
    scanf_s("%s", p->s->name, sizeof(p->s->name));
    printf("修改成功\n");
    break;
case 3:
    printf("输入修改后的成绩:\n");
    scanf_s("%d", &p->s->score);
    printf("修改成功\n");
    break;
case 4:
    return;
default:
    printf("不存在该选项,请重新选择\n");
}

}

// 查找
void find(struct temp* head) {
if (head == NULL) {
printf("链表为空\n");
return;
}

char num[8] = { 0 };
printf("输入学号:\n");
scanf_s("%s", num, sizeof(num));

struct temp* p = head;
while (p != NULL && strcmp(p->s->num, num) != 0) {
    p = p->next;
}

if (p != NULL) {
    printf("学号:%s\t 姓名:%s\t 成绩:%d\n", p->s->num, p->s->name, p->s->score);
}
else {
    printf("未找到该学号的学生\n");
}

}

// 显示
void app(struct temp* head) {
if (head == NULL) {
printf("链表为空,没有学生信息。\n");
return; // 提前返回,避免后续操作
}

int n = 0;
struct temp* p = head;
while (p != NULL) {
    if (p->s != NULL) {   // 确保指针 s 不是 NULL
        n++;
        printf("学号:%s\t 姓名:%s\t 成绩:%d\n", p->s->num, p->s->name, p->s->score);
    }
    p = p->next;
}
printf("总共有 %d 名学生的信息\n", n);

}

//因为在输入姓名和学号时用的是%s,即字符串,所以name[5]实际上只有4个数组元素和一个\0;num[8]有7个数组元素和一个\0。
// 所以,该程序输入学号应该是7位。

(一)、复习字符串和数组:
在C语言中,字符串和数组的长度定义以及存储\0(空字符)的方式是非常重要的。以下是对你问题的详细解答:

  1. 字符串长度为5,是否包含\0
    在C语言中,字符串是以字符数组的形式表示的,并且以一个特殊的空字符\0(NUL字符)结尾。这个\0用于标识字符串的结束。因此,如果你定义一个字符数组的长度为5,这个数组通常可以存储最多4个可见字符和1个用于结尾的\0。

例如:
c
char str[5]; // 数组长度为5
这个数组可以存储字符串 "abcd",它的内容是:

str[0] = 'a'
str[1] = 'b'
str[2] = 'c'
str[3] = 'd'
str[4] = '\0' // 用于结束字符串
这里,字符串 "abcd" 的长度是4,实际存储的字符是4个,加上结尾的\0,使总的数组长度为5。

  1. 数组长度为5,是否包含\0
    如果你定义一个数组长度为5,并不意味着这个数组会自动包含\0。它只是一个存储空间,数组的内容由程序员管理。

例如:

char arr[5]; // 数组长度为5
在这种情况下,arr的初始内容是未定义的,除非你显式地为数组赋值。例如:

arr[0] = 'h';
arr[1] = 'e';
arr[2] = 'l';
arr[3] = 'l';
arr[4] = '\0'; // 显式地添加'\0'
这里,数组的实际字符是 "hell",后面是\0。如果没有显式地添加\0,那么数组就不是一个有效的字符串。
结论
字符串长度(例如:字符数组定义为 char str[5])意味着可以存储4个字符和1个\0,所以实际有效字符数为4。
数组长度(例如:char arr[5])本身并不自动包含\0,只有当你显式地将其设置为\0时,它才成为一个有效的C字符串。
总之,字符串在C语言中始终以\0结束,而数组则需要程序员自己管理其中的内容和结束标志。
(二)、malloc:
处理复杂数据结构
在实现如链表、图和树等复杂数据结构时,通常需要动态分配节点。这使得可以在运行时根据需要添加或删除节点。

struct Node {
int data;
struct Node *next;
};

struct Node *newNode = (struct Node *)malloc(sizeof(struct Node)); // 动态分配节点

反思:这个系统还有许多不足的地方,比如在修改程序的时候,选择修改分数,结果输入成非int型的数据程序就会崩溃,还有当输入超出字符串范围的数据时,系统不会报错,但该数据却不会显示出来。应该加入对输入的数据的类型、大小约束的条件,如果输入错误弹出提醒。

标签:head,struct,temp,管理系统,链表,num,printf,NULL,语言
From: https://www.cnblogs.com/LiuHuWei/p/18460176

相关文章

  • RBAC管理系统审计记录
    RBAC管理系统审计记录环境搭建环境依赖Windowsidea2022jdk8RBAC源码phpstudy的mysql5.6.7简易搭建流程(Windows下)直接使用idea打开项目,然后选中右上角的项目构建项目中有几处需要修改:○1、要开启phpstudy的mysql,然后创建rbac数据库,并将源码中的rbac.sql数据导入......
  • springboot空巢老人健康管理系统小程序-计算机毕业设计源码29889
    摘 要随着社会老龄化程度不断加剧,空巢老人群体的健康管理问题日益引起人们的关注。为了更好地满足空巢老人群体的健康管理需求,本研究致力于设计并实现一款基于SpringBoot框架的空巢老人健康管理系统。该系统旨在为管理员用户、老人用户和医生用户提供全方位的健康管理服务,......
  • C语言的常见概念(三)
    上一期讲到了关于转义字符的知识与使用,今天继续为大家介绍C语言中的语句与语句使用,以及关于注释的相关知识语句和语句的使用语句和语句分类C语言的代码是由⼀条⼀条的语句构成的,C语言中的语句可为以下五类:•空语句•表达式语句•函数调用语句•复合语句•控制......
  • LLM 教程 1 —— 大语言模型入门
    本文将介绍大语言模型的重要性,它们如何被训练,应用场景,面临的挑战与风险,以及未来发展方向。阅读完毕后,您将对大语言模型的潜力和能力有更深入的理解。1、大语言模型是什么?大语言模型(LLM)是一种能够执行多种自然语言处理任务的机器学习模型,包括生成文本、分类文本、以对话......
  • 【C语言】语义陷阱(5):揭秘空指针与空字符串的微妙差异
    目录一、空指针(NullPointer)1.1.定义与表示1.2.用途1.3.安全性 1.4.注意事项1.5.空指针与野指针的区别1.5.1.特性对比1.5.2.安全性与风险1.5.3.编程实践二、指向空字符串的指针2.1.定义2.2.字符数组与空字符串2.3.指针的初始化2.4.空字符串的用途2......
  • 【反转链表】【K个一组翻转链表】两个问题具体思路,文中含多种解法(附完整代码)
    文章目录前言一、如何理解反转链表?二、反转链表1.方法一(递归)方法二(迭代)三、K个一组翻转链表前言本文将围绕【反转链表】问题展开详细论述。采用【递归法】【迭代法】同时,还将进一步升级该问题,讨论【K个一组翻转链表】一、如何理解反转链表?题目链接:[点击......
  • taozige/Java语言的Netty框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码
    云快充协议+云快充1.5协议+云快充1.6+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩协议+云快充源码介绍云快充协议+云快充1.5协议+云快充1.6+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩协议+云快充源码软件架构1、提供云快......
  • 链表-数据结构
    链表的连接简单题目描述:创建两个链表:S1,S2;让s1和s2实现合并连接;连接要求:输入s1节点的数值下标和输入s2的数值下标,如果数值相同实现连接;比如:cin>>s1(2),cin>>s2(0);就让s1的下标2:数值1和s2的下标0:数值1比较相同--------321123s1数值1在跟s......
  • java计算机毕业设计管易tms运输智能监控管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在现代物流行业中,运输管理系统的智能化与高效化已成为提升企业竞争力的关键因素之一。随着电子商务和快递业务的迅猛发展,货物运输量急剧增加,传统的人......
  • java计算机毕业设计M站内容管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,各类在线服务平台应运而生,为用户提供便捷、高效的服务体验。M站内容管理系统作为一种专门为管理网站内容设计的系统,其重要......