C语言链表-记录学生信息

news2025/1/12 0:59:30

在这里插入图片描述

题目要求:

创建一个 单向链表 来记录学生信息,人数3–5人;链表结点为结构变量,结构的要求如下:

struct stu_info

{

     char stu_num[10];  //学号
     char stu_name[8];  //姓名
     char stu_sex[2];    //性别
     int stu_score    //成绩
     struct stu_info *next;
};

程序设计要求:

(1)插入新的学生信息(插入节点的位置可任意指定)

(2)删除指定的学生信息

(3)根据学号查询并显示查询到的学生信息

(4)以上三项任务分别自定义函数实现,执行后显示执行结果

(5)程序运行后要求可以循环执行前三项操作,直到选择退出时结束程序

完整代码:

#include<bits/stdc++.h>
#include <cstdlib>

struct stu_info {
	char stu_num[10]; // 学号
	char stu_name[8]; // 姓名
	char stu_sex[2]; // 性别
	int stu_score; // 成绩
	struct stu_info *next; // 指向下一个结点的指针
};
// 插入新的学生信息
void insert_node(struct stu_info **head, char *stu_num, char *stu_name, char *stu_sex, int stu_score, int pos) {
// 申请新结点

struct stu_info *new_node = new stu_info;
// 将新结点的信息赋值
	strcpy(new_node->stu_num, stu_num);
	strcpy(new_node->stu_name, stu_name);
	strcpy(new_node->stu_sex, stu_sex);
	new_node->stu_score = stu_score;

// 如果要插入的位置是第一个,则直接将新结点插入到链表头
	if (pos == 1) {
		new_node->next = *head;
		*head = new_node;
		return;
	}

// 否则,在链表中找到要插入的位置
	struct stu_info *p = *head;
	int i;
	for (i = 1; i < pos - 1 && p != NULL; i++) {
		p = p->next;
	}

// 如果找到了要插入的位置,则将新结点插入到该位置
	if (p != NULL) {
		new_node->next = p->next;
		p->next = new_node;
	}
}
// 删除指定的学生信息
void delete_node(struct stu_info **head, char *stu_num) {
// 先找到要删除的结点的前一个结点
	struct stu_info *prev = *head;
	while (prev->next != NULL && strcmp(prev->next->stu_num, stu_num) != 0) {
		prev = prev->next;
	}
// 如果找到了要删除的结点,则将前一个结点的 next 指针指向要删除的结点的下一个结点
	if (prev->next != NULL) {
		struct stu_info *node_to_delete = prev->next;
		prev->next = node_to_delete->next;
		free(node_to_delete);
	}
}
// 根据学号查询并显示查询到的学生信息
void find_node(struct stu_info *head, char *stu_num) {
	struct stu_info *node = head;
	while (node != NULL) {
		if (strcmp(node->stu_num, stu_num) == 0) {
// 找到了学号匹配的结点,输出其信息
			printf("学号: %s\n", node->stu_num);
			
			printf("姓名: %s\n", node->stu_name);
			printf("性别: %s\n", node->stu_sex);
			printf("成绩: %d\n", node->stu_score);
			return;
		}
		node = node->next;
	}
// 如果没有找到学号匹配的结点,则输出提示
	printf("未找到学号为 %s 的学生信息\n", stu_num);
}
int main() {
// 初始化链表
	struct stu_info *head = NULL;
// 循环执行操作
	int op;
	do {
		printf("\n1. 插入学生信息\n");
		printf("2. 删除学生信息\n");
		printf("3. 查询学生信息\n");
		printf("4. 退出\n");
		printf("请选择要执行的操作: ");
		scanf("%d", &op);
		switch (op) {
			case 1: {
				// 插入学生信息
				char stu_num[10];
				int pos;
				char stu_name[8];
				char stu_sex[2];
				int stu_score;
				printf("请输入要插入的学号: ");
				scanf("%s", stu_num);
				printf("请输入要插入的姓名: ");
				scanf("%s", stu_name);
				printf("请输入要插入的性别: ");
				scanf("%s", stu_sex);
				printf("请输入要插入的成绩: ");
				scanf("%d", &stu_score);
				printf("请输入要插入的位置(1-based): ");
				scanf("%d", &pos);
				insert_node(&head, stu_num, stu_name, stu_sex, stu_score, pos);
				break;
			}
			case 2: {
				// 删除学生信息
				char stu_num[10];
				printf("请输入要删除的学号: ");
				scanf("%s", stu_num);
				delete_node(&head, stu_num);
				break;
			}
			case 3: {
// 查询学生信息
				char stu_num[10];
				printf("请输入要查询的学号: ");
				scanf("%s", stu_num);
				find_node(head, stu_num);
				break;
			}
			case 4: {
// 退出程序
				break;
			}
			default: {
				printf("输入错误,请重新输入\n");
				break;
			}
		}
	} while (op != 4);
	return 0;
}

运行截图:


整体简介

段代码实现了一个带头结点的单链表,其中定义了四个函数:

insert_node 函数:在单链表的指定位置插入一个新的学生信息结点。
delete_node 函数:删除单链表中指定学号的学生信息结点。
find_node 函数:根据学号查询并显示查询到的学生信息。
display_list 函数:显示单链表中所有学生信息。
结构体 stu_info 定义了学生信息结点所包含的信息,包括学号、姓名、性别、成绩以及指向下一个结点的指针。

使用时,你需要先创建一个带头结点的单链表,然后调用上述四个函数来插入、删除和查询学生信息,或者调用 display_list 函数来显示整个单链表。

例如,如果你想要在单链表的第二个位置插入一个新的学生信息结点,可以这样调用 insert_node 函数:

insert_node(&head, “123456”, “John”, “M”, 85, 2);

这里,head 是指向单链表头结点的指针,后面的参数分别是学号、姓名、性别、成绩和插入位置。

函数介绍:

insert_node

insert_node 函数是用来在单链表的指定位置插入一个新的学生信息结点的。它有两个参数:

head:指向单链表头结点的指针。
pos:插入位置。
除此之外,还有其他四个参数,分别是学号、姓名、性别和成绩。

使用时,你可以这样调用 insert_node 函数:

insert_node(&head, “123456”, “John”, “M”, 85, 2);

这里,head 是指向单链表头结点的指针,2 是插入位置,后面的参数分别是学号、姓名、性别和成绩。
代码:

// 插入新的学生信息
void insert_node(struct stu_info **head, char *stu_num, char *stu_name, char *stu_sex, int stu_score, int pos) {
  // 申请新结点
  struct stu_info *new_node = (struct stu_info*)malloc(sizeof(struct stu_info));
  // 将新结点的信息赋值
  strcpy(new_node->stu_num, stu_num);
  strcpy(new_node->stu_name, stu_name);
  strcpy(new_node->stu_sex, stu_sex);
  new_node->stu_score = stu_score;

  // 如果要插入的位置是第一个,则直接将新结点插入到链表头
  if (pos == 1) {
    new_node->next = *head;
    *head = new_node;
    return;
  }

  // 否则,在链表中找到要插入的位置
  struct stu_info *p = *head;
  int i;
  for (i = 1; i < pos - 1 && p != NULL; i++) {
    p = p->next;
  }

  // 如果找到了要插入的位置,则将新结点插入到该位置
  if (p != NULL) {
    new_node->next = p->next;
    p->next = new_node;
  }
}

delete_node

这个函数有两个参数:

head:指向单链表头结点的指针,用于修改链表结构。
stu_num:要删除的学生的学号。
在函数内部,首先会找到要删除的结点的前一个结点。如果找到了要删除的结点,则将前一个结点的 next 指针指向要删除的结点的下一个结点,最后将要删除的结点释放掉。

使用时,你可以这样调用 delete_node 函数:

delete_node(&head, “123456”);

这里,head 是指向单链表头结点的指针,“123456” 是要删除的学生的学号。
代码:

// 删除指定的学生信息
void delete_node(struct stu_info **head, char *stu_num) {
  // 先找到要删除的结点的前一个结点
  struct stu_info *prev = *head;
  while (prev->next != NULL && strcmp(prev->next->stu_num, stu_num) != 0) {
    prev = prev->next;
  }
  // 如果找到了要删除的结点,则将前一个结点的 next 指针指向要删除的结点的下一个结点
  if (prev->next != NULL) {
    struct stu_info *node_to_delete = prev->next;
    prev->next = node_to_delete->next;
    free(node_to_delete);
  }
}

find_node

这个函数有两个参数:

  1. head:指向单链表头结点的指针,用于遍历链表。
  2. stu_num:要查询的学生的学号。

在函数内部,首先会从链表头开始遍历,每次遍历时比较当前结点的学号与要查询的学号是否相同。如果相同,则显示该结点的信息,然后结束遍历。

使用时,你可以这样调用 find_node 函数:

find_node(head, “123456”);

这里,head 是指向单链表头结点的指针,"123456" 是要查询的学生的学号。

代码:

// 根据学号查询并显示查询到的学生信息
void find_node(struct stu_info *head, char *stu_num) {
	struct stu_info *node = head;
	while (node != NULL) {
		if (strcmp(node->stu_num, stu_num) == 0) {
// 找到了学号匹配的结点,输出其信息
			printf("学号: %s\n", node->stu_num);
			
			printf("姓名: %s\n", node->stu_name);
			printf("性别: %s\n", node->stu_sex);
			printf("成绩: %d\n", node->stu_score);
			return;
		}
		node = node->next;
	}
// 如果没有找到学号匹配的结点,则输出提示
	printf("未找到学号为 %s 的学生信息\n", stu_num);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flowable学习笔记(二):flowable实战

1.定义流程模板 (1)Call Activity&#xff08;调用活动&#xff09; 在这个流程图中&#xff0c;定义了一个开始节点、调用活动节点和结束节点&#xff08;bpmn.xml文件在文章最后附上&#xff09;。 开始节点&#xff1a;定义了一个执行监听器&#xff08;commonStartExecut…

【MyBatis】进一步理解choose、when、otherwise标签

choose、when、otherwise choose里面包含when、otherwise两个标签&#xff0c;choose是父标签&#xff0c;when和otherwise必须都要写在它里面 当 when 中有条件满足的时候&#xff0c;就会跳出 choose&#xff0c;即所有的 when 和 otherwise 条件中&#xff0c;只有一个会输…

半导体设备中制冷系统的压力和温度准确控制解决方案

摘要&#xff1a;针对半导体低温工艺中制冷系统在高压防护和温度控制中存在的问题&#xff0c;本文将提出一种更简便有效的解决方案。解决方案的核心是在晶片托盘上并联一个流量可调旁路&#xff0c;使制冷剂在流入晶片托盘之前进行部分短路。即通过旁路流量的变化调节流出晶片…

罗切斯特大学将研究未来执行军事任务的量子计算

罗切斯特大学的专家将开发受量子启发的求解器系统&#xff0c;以解决军事任务中的实际问题。 美国军事研究人员需要使用量子启发求解器系统的量子计算技术&#xff0c;将高性能计算性能提高至少两个数量级的新方法。于是&#xff0c;他们从纽约的罗切斯特大学找到了解决方案。美…

Akka 进阶(三)Route 路由

目录一 路由Actor二 Pool方式的方式创建路由三 Group方式创建路由消息可以通过多种方式送达目的地&#xff0c;比如tell、ask、forward等&#xff0c;这些方式是最常规也是最简单的&#xff0c;但是对于复杂的消息投递逻辑&#xff0c;比如轮询投递、随机投递、广播组等&#x…

IB课程预估分,请认真规划学习进程

近年受疫情影响&#xff0c;IB考试形式与分数情况&#xff0c;有不小的波动&#xff0c;年度出分依然吸引着众人目光。尤其明后年准备参加大考的同学&#xff0c;更关心实战难度和考试分数的变化趋势。 01预估分&#xff1a;严重被压低的预期分数 全球疫大环境下&#xff0c;IB…

合宙 ESP32C3 烧录 Micropython 后连接端口报错

合宙esp32c3 开发板烧录micropython 后连接VScode 或 Thonny报错&#xff1a; Device is busy or does not respond. 1. 原因&#xff1a; 烧录的micropython bin文件有问题。 问题参考&#xff1a; 链接: 合宙ESP32-C3 烧录Micropython报错入坑记 2. 解决办法&#xff1a…

H3C smart-link实验 C套拆解

H3C smart-link实验 C套拆解一、项目拓扑二、项目需求三、配置步骤1.vlan-trunk2.STP3.smart-link四、测试一、项目拓扑 二、项目需求 总部局域网内sw3进行双上行链路灵活备份&#xff0c;smart-link组1 引用实例1(绑定vlan10)的流量从经过sw1的链路通向出口路由器r1&#xff…

10个优秀的Python库,实用且有趣

序言 哈喽兄弟们&#xff0c;今天分享10个优秀的Python库&#xff0c;超级实用&#xff01; 为什么这么多人选择学习python?首先&#xff0c;python是一门全场景编程语言&#xff0c;对于初学编程的人而言&#xff0c;选择一门全场景编程语言是非常不错的选择;其次&#xff…

PHP aws-sdk-php文件存储的实现与应用

前言 最近项目需要用到对象存储&#xff0c;将所有上传文件&#xff0c;存储到BOS云存储上。在开发过程中&#xff0c;遇到一些小小的问题&#xff0c;做个简单记录。 功能实现 1 下载sdk&#xff08;以下两种方式&#xff0c;任选其一即可&#xff09; &#xff08;1&#…

手绘图说电子元器件-电阻,电容,电感

电阻器与电位器 电阻器是最基本的电子元件,电位器是最基本的可调电子元件,它们广泛应用在各种电子电路中。 电阻器 电阻器是限制电流的元件,通常简称为电阻,是一种最基本、最常用的电子元件,包括固定电阻器、可变电阻器、敏感电阻器等。 电阻器的主要参数有电阻值和额…

FFT(2)

DFT到FFT 这是DFT公式 对DFT代数变换 将DFT的计算&#xff0c;分为计数组和偶数组。 惊奇的发现&#xff1a;只需要改变WkNW_k^NWkN​的符号即可得到X&#xff08;k&#xff09;的另一半项数的结果。 得到FFT算法&#xff08;蝶形运算&#xff09; 惊奇的发现&#xff1…

docker安装教程,即学即会

docker教程&#xff1a; https://www.runoob.com/docker/docker-tutorial.html卸载docker 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序&#xff0c;请卸载它们以及相关的依赖项。 yum remove docker docker-client docker-client-latest docker-co…

maven打包缺少依赖异常eu.neilalexander:jnacl:jar:1.0.0 was not found in...解决

在Linux系统的服务器上使用脚本部署项目&#xff0c;脚本的逻辑是&#xff1a; 进入到工作空间的项目文件夹从SVN拉取最新代码命令svn up执行mvn clean执行mvn package进入jar包生成的target文件夹nohub java -jar xxxxx.jar >/dev/null 2>&1 & 在项目打包过程…

C++迭代器详解

思考一个问题&#xff1a;我们该如何遍历一个字符串呢&#xff1f; 方法一&#xff1a;正常遍历 string s1("hello"); for(size_t i 0;i<s1.size();i) {cout<<s1[i]<<" ";//[]是一个重载运算符&#xff0c;实际上调用了s1.operator[](i)…

【爬虫+数据清洗+可视化分析】用Python分析哔哩哔哩“阳了“的评论数据

目录 一、背景介绍 二、爬虫代码 爬虫部分不作讲解。 三、可视化代码 3.1 读取数据 3.2 数据清洗 3.3 可视化 3.3.1 IP属地分析-柱形图 3.3.2 评论时间分析-折线图 3.3.3 点赞数分布-直方图 3.3.4 评论内容-情感分布饼图 3.3.5 评论内容-词云图 三、演示视频 一、…

Ansible常用模块

ping模块 验证主机的连通性 [rootmonster1 ~]# ansible all -m ping 192.168.71.131 | SUCCESS > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong&q…

Java中mongodb指定DB通过aggregate聚合查询操作示例

目录 前言&#xff1a; 应用场景&#xff1a; 命令描述&#xff1a;​ 代码示例&#xff1a; 聚会查询&#xff1a; 数量查询&#xff1a; 前言&#xff1a; 大家都知道&#xff0c;mongodb是一个非关系型数据库&#xff0c;也就是说&#xff0c;mongodb数据库中的每张表…

node-express学习总结

项目搭建 1. 使用express提供的框架构建&#xff08;不需要&#xff09; 2. 从零开始&#xff08;推荐&#xff09;安装 初始化项目 npm init -y安装express npm install express1.express的基本使用 创建js文件 const express require(express) // 1&#xff0c;创建服…

SSL/TLS类安全漏洞及SLB安全漏洞问题

SSL/TLS类安全漏洞及SLB安全漏洞问题1 : 问题背景1.1、SSL/TLS类漏洞-Sweet32 攻击1.2、SSL/TLS类漏洞-弱密码套件2 : 解决思路2.1、学习SSL/TLS是什么2.2、安装检测工具2.3、升级OpenSSL2.4、调整加密算法3 : 总结3.1、比较环境的不同3.2、解决该问题3.3、相关资源1 : 问题背景…