linux下内核链表实现学生信息管理系统

C语言零基础实战:从环境搭建到学生信息管理系统项目开发 编程语言是连接人类逻辑与计算机硬件的桥梁,而C语言作为一门接近底层的通用过程式语言,其核心价值在于帮助开发者深入理解计算机系统的工作原理,如内存管理、数据结构与程序执行流程。通过学习C语言,可以掌握结构化编程思想,为后续学习C++、Java、Rust等语言奠定坚实基础,同时也是嵌入式开发、操作系统等底层系统开发的必备技能。本文以初学者常遇到的**指针**和**内存分配**等难点为切入点,通过一个完整的“学生信息管理系统”项目实践,串联变量、函数、结构体、文件读写等核心概念,旨在帮助学习者从环境搭建开始,逐步 阅读详情

内核链表

  我们知道,内核链表是双向链表,在这里不详细介绍内核链表的概念,只列出demo并附上注释供需要的同学参考。

下面使用内核链表完成基本的增删改查,实现简易的学生信息管理系统,拥有保存信息到txt文本的功能,和从txt中读取信息的功能。(内核链表的头文件可以百度直接下载)

#include"kernel_list.h"    //内核链表的头,只需加入内核链表的c文件,一起编译即可运行该程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>    //fopen函数
#include<fcntl.h>        

//结构体
typedef struct list{

char name[20]; //名字
int score; //分数
int classs; //班级
struct list_head mylist; //内核链表中特有的小结构体,

}Node;    //结构体别名,结构体的详细使用在上一篇已介绍

//初始化链表
Node *init_list(Node* head)
{
    head=malloc(sizeof(Node)); //为head向内存申请空间
    if(head == NULL){
    perror("head");    //如果出错,输出错误信息
    exit(1);
    }
    INIT_LIST_HEAD(&(head->mylist));    //内核链表初始化

    return head;    //返回头节点
}

//增(尾插)
int insert_tail(Node* head,char *name,int score,int classs)
{
    Node* new=malloc(sizeof(Node));    //为新增的节点分配内存
    if(new == NULL)
    {
        perror("new");
        exit(2);
    }
    strcpy(new->name,name);    //name是数组,所以不能直接赋值,使用strcpy函数
    new->score=score;
    new->classs=classs;

    list_add_tail(&(new->mylist),&(head->mylist));    //内核链表尾插

    return 0;
}

//删
int delete_node(Node* head,char *name)
{
    Node* p = NULL;
    list_for_each_entry(p,&(head->mylist),mylist)    //内核链表遍历
    {
        if(!strcmp(p->name,name))     //字符串比较函数,如果有相同返回0
        {         
            list_del(&p->mylist);        //内核链表删除
            printf("%s is delete finsh!\n",name);
            return 0;
        }else 
            printf("没有这个名字\n");
        return 0;
    }
 
return 0;
}

//查
int find_node(Node* head,char *data)
{

    Node* p=NULL;        //定义一个结构体指针,指向空
    list_for_each_entry(p,&(head->mylist),mylist)        //内核链表遍历
    {
    if(!strcmp(p->name,data)){            //字符串比较函数,如果有相同返回0
        printf("you find name is %s\n",data);
        printf("name is %s,score is %d,class is %d\n",p->name,p->score,p->classs);
        return 0;
    }else
        printf("查不到这个名字\n");
    return 1;

    }

return 0;

}

//显示当前信息
int show_list(Node* head)
{
    Node* p = NULL;
    list_for_each_entry(p,&head->mylist,mylist)
    {
        printf("name is %s,score is %d,class is %d\n",p->name,p->score,p->classs);

    }
    return 0;
}

//保存信息到txt
int save_node(Node* head)
{
    FILE *fp;
    Node *p=NULL;
    if((fp=fopen("student.txt","w+"))==NULL){    //w+表示,如果存在就清空,不存在就创建
        perror("open");
    }
    list_for_each_entry(p,&(head->mylist),mylist)
    {
        fprintf(fp," %s %d %d ",p->name,p->score,p->classs);    //将信息写入txt中
    }

    fclose(fp);    //使用完关闭
    return 0;

}

//从txt中读取文件信息,并打印到屏幕
int load_node(Node* head)
{
    char name[20];
    int score;
    int classs;

    FILE *fp;
    if((fp=fopen("student.txt","r"))==NULL){
        perror("open");
    }

    Node*p=malloc(sizeof(Node));
    //Node*p=NULL;
    list_for_each_entry(p,&(head->mylist),mylist){
        fscanf(fp,"%s %d %d ",p->name,&(p->score),&(p->classs));    //从txt中读出信息到链表结构
        printf("name is %s,score is %d,class is %d\n",p->name,p->score,p->classs);
    }

    fclose(fp);

    return 0;
} 



int main()
{
    Node* list=init_list(list);//初始化空链表函数
    char name[20];
    int score;
    int classs;
    int num,count=1;
    int ret;
    int j=1;
    char value[30] = {0} ;
    char *pA;

    while(1)
    {

        puts("***********主菜单**********");
        puts("-------1:增加学生信息------");
        puts("-------2:显示学生信息------");
        puts("-------3:删除学生信息------");
        puts("-------4:查找学生信息------");
        puts("-------5:保 存 信  息------");
        puts("-------6:读 取 信  息------");
        puts("-------7:退 出 系  统-------");
        puts("***************************");
        printf("请输入对应选项:");
        scanf("%d",&num);
        switch(num)
        {
			case 1:
			while(count)
			{
				puts("-------1:输入信息----------");
				puts("-------2:返回上一层--------");
				printf("请输入对应选项:");
				scanf("%d",&num);
				switch(num)
				{
					case 1:
					printf("请输入学生姓名: ");
					scanf("%s",name);
					printf("请输入学生分数: ");
					scanf("%d",&score);
					printf("请输入学生班别: ");
					scanf("%d",&classs);

					insert_tail(list,name,score,classs);

					break;

					case 2:
					count=0;
					break;

					default:
					printf("对不起,没有这个选项,请重新选择:\n");
					continue;
					break;

				}
			}
			break;

			case 2:
			show_list(list);
			break;

			case 3:
			pA= &value[0];  
			printf("请输入你要删除的学生名字:\n");
			scanf("%s",value);       
			while(getchar() != '\n');  //清空输入缓冲
			while(*pA != '\0')  
			{
				if( *pA >= 'a' && *pA <= 'z')
				{
					delete_node(list,value);
					break;
				}
				else 
				{
					printf("input Error !\n");
					break;
				}

				pA++;
			}
			break;

			case 4:
			while(j)
			{
				pA= &value[0];  
				printf("请输入你要查找的学生名字:\n");
				scanf("%s",value);       
				while(getchar() != '\n');  //清空输入缓冲
				while(*pA != '\0')  
				{
					if( *pA >= 'a' && *pA <= 'z')
					{
						ret=find_node(list,value);
						if(ret==0){
							j=0;
						}       
						break;
					}else {
						printf("input Error !\n");
						break;
					}


					pA++;
				}
			}
			break;

			case 5:
			save_node(list);
			break;

			case 6:
			load_node(list);
			break;

			case 7:
			printf("bye,see you!\n");
			exit(0);

			default:
			printf("对不起,没有这个选项,请重新选择:\n");
			continue;
			break;
		}
    }

    
	return 0;
 
}

因为工作比较忙csdn不是经常上,如果大家有任何疑问或者找我聊技术唠唠嗑,欢迎加我微信a5230gxkd交流,一起进步,或者在我的公众号底下留言,我会第一时间回复

C语言在开发中的应用博文汇总贴 自己成长的同时也不要忘记带动别人一起成长,前人种树,后人乘凉,我宁愿做种树人,让读者乘凉。 以下有些文章时间比较长了,这里只做汇总,随着个人能力的提升,不可否认有些文章中描述的有不正确或者不恰当的地方,如果您看到了,请帮忙指出,感谢您对我的支持。 一、C基础 关于C语言中输出格式 C语言指针分析(一) 浅谈C之精华—指针 C语言关键字static的绝妙用途 C语言结构体深度剖析 对嵌入式开发C语言... 阅读详情

相关推荐

从生成到检测:全面解析Deepfake技术的演进与对抗策略

本文全面解析了Deepfake技术的演进与对抗策略,从GAN生成技术到先进的检测手段,探讨了其在娱乐与安全领域的双重影响。文章详细介绍了Deepfake的核心原理、技术迭代关键节点以及最新的检测方法,揭示了AI生成与识别的激烈博弈。同时,展望了量子计算和生物特征认证在未来攻防战中的潜在应用。

jenkins8butler的博客 255

双向循环链表实践---学生管理系统

写在前面 在看Linux源码时,经常会涉及到驱动和设备的匹配,如果想弄清楚匹配过程,就要理解双向循环链表。 这篇文章是理解了Linux的list.h文件后自己的实现应用。 理论知识 实现步骤 链表的常用的节点操作如下: 增加、删除、查找 首先定义一个结构体,存放学生的信息 struct student { int number; char id[20];

不积硅步,无以至千里 1916

esim分布式云卡池技术

eSIM卡,即Embedded-SIM,嵌入式SIM卡。eSIM卡的概念就是将传统SIM卡直接嵌入到设备芯片上,而不是作为独立的可移除零部件加入设备中,用户无需插入物理SIM卡。这一做法将允许用户更加灵活的选择运营商套餐,或者在无需解锁设备、购买新设备的前提下随时更换运营商。未来通用的eSIM标准建立将为普通消费者、企业用户节省更多移动设备使用成本,并带来更多的便利、安全性。 2018年 3月7日,中国联通宣布,正式在上海、天津、广州、深圳、郑州、长沙6座城市率先启动“eSIM一号双终端”业务的办理。[.

著名博客 3707

linux 双向链表详解

一、LIST_HEAD 创建一个链表头header。 1.LIST_HEAD(header); 创建一个实际节点,将其加在header后面。 2.list_add(&first_node.list, &header); 再创建一个节点,将其加在header后面。 3.list_add(&second_node.list, &header); 参考:https://blog.youkuaiyun.com/wanshilun/article/details/79747710 ..

酷小川的博客 2284

Linux系统下SAPGUI安装包选择与避坑指南

本文详细介绍了在Linux系统下选择和安装SAPGUI安装包的策略与避坑指南。重点解析了不同版本安装包的关键区别,特别是Linux版必须包含linux-lib.jar和linux64-lib.jar文件,避免误用Mac或Windows版导致的兼容性问题。文章还提供了针对Ubuntu、RHEL等不同Linux发行版的安装实战指南,以及常见报错的解决方案,帮助用户顺利完成SAPGUI的安装与配置。

weixin_28366353的博客 673

Python3.8下MvCameraControl.dll加载失败?3种方法彻底解决FileNotFoundError

本文针对Python3.8及以上版本在Windows平台调用MvCameraControl.dll时出现的FileNotFoundError问题,深入剖析了其根源在于Python 3.8引入的DLL加载安全机制变更。文章提供了三种核心解决方案:显式指定DLL完整路径、使用os.add_dll_directory()添加可信目录,以及利用ctypes的winmode参数进行精细控制,并给出了工程化封装建议,帮助开发者彻底解决此兼容性问题。

weixin_29093017的博客 190

linux内核之双向循环链表

list内核链表操作

weixin_44235286的博客 1256

EMC原理-传导(共模、差模)与辐射(近场、远场)详解

本文深入介绍了电磁兼容(EMC)的基本概念,包括EMI和EMS,以及如何处理传导干扰(共模、差模)和辐射干扰(近场、远场)。详细讨论了近场感应、远场辐射的原理,滤波器和屏蔽技术在抑制噪声信号中的作用。此外,探讨了差模和共模干扰的来源、影响及滤除方法,如使用差模电感、电容和共模线圈。最后,提到了穿心电容在滤除高频噪声中的应用。

让你爱上电路设计 3550

Linux 内核双向链表

0x01:链表 链表是Linux内核中非常重要的数据结构,在日常内核驱动开发过程中,往往需要遍历内核的某个链表,内核提供了一套完整的双链表机制,使开发者可以在内核私有数据结构中轻松构建双向链表,这里一起学习以下双向链表的构建和遍历方法,具体链表的知识可以参考文末链接; 0x02:双向链表的构建和遍历 直接给出代码: //list.c #include <linux/kernel.h> #include <linux/init.h> #include <linux/module.

qq_42931917的博客 1803

【100%通过率】华为od机试C卷【出差 / 员工派遣】C++ 实现

某公司部门需要派遣员工去国外做项目。现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工部门每个员工有一个员工号 (1,2,3,......),工号连续,从 1开始。部长派遣员工的规则:

MISAYAONE的博客 2192

dify upload存在SSRF漏洞

Dify 是一个用于构建 AI 应用程序的开源平台。

nnn2188185的博客 1478

Linux内核基础数据结构-双链表

链表概述 链表作为一种基本的数据结构,得益于其简单的结构、优良的性能(双向链表的插入和删除复杂度都是O(1)),被广泛的应用于各种程序设计中。链表一般分为单向链表和双向链表。对于单向链表,其删除和插入的一般复杂度都是O(n),所以,工程上一般很少使用,下面介绍的所有链表都是双向链表。 常见的双向链表数据结构定义如下: struct list_node_xxx{ struct list_node_xxx *prev,*next; //具体的数据,比如一个char数组 char data[100]; };

飞翔de刺猬 1570

人工智能 (Artificial Intelligence, AI) 原理与代码实例讲解

人工智能 (AI) 机器学习 (Machine Learning) 深度学习 (Deep Learning) 算法 模型 代码实例 应用场景 1. 背景介绍 人工智能 (Artificial Intelligence, AI) 作为一项前沿科技,近年来发展迅速,已渗透到生活的方方面面

AI架构师小马 1226

话说linux内核链表(一)

一、内容介绍 链表作为一种基础的数据结构,分为:单链表、双链表以及循环链表,在日常的编程中很常用。在C语言的编程中,通常情况下,我们根据实际的需求来实现对应的链表。链表有:初始化、插入、删除、判空等操作。 在linux内核中,对链表的使用真是无处不在的,比如设备、总线、驱动模型中,对挂载在总线上的设备和驱动就是分别各用一个链表进行管理的;又比如一个驱动可以作用于多个设备,那么"struct device_driver"中也有一个用于管理设备的链表。所以理解链表的实现原理以及熟练使用对理解内核代码、驱动开发至

xie0812的专栏 490

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

linux下c的管理系统,Linux C语言实现学生管理系统

一、内核链表:1. 含义:Linux 内核中自己实现了双向链表,可以在 include/linux/list.h 找到定义。2. 作用:不包含数据域,可以嵌入大结构体中,实现大结构体之间的连接。3. 部分函数说明:/**函数名:list_add*功能:头部插入新结点*参数:*new---新结点*head---头结点*返回值:无**/staticinline...

weixin_32546235的博客 879

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

list.h头文件分析

序:觉得这哥们写的不错,再转来给大家看。双链表的应用在内核中随处可见,list.h头文件集中定义了双链表(struct list_head结构体)的相关操作。比如这里的一个头文件中就有大量的struct list_head型的数据。关于list.h的分析,网上资料很多,这里只是记录我在分析list.h中遇到的问题。0.struct list_head结构体可能这样写,更让我们习惯:1struct list_head {2struct list_head *next;3struct list_head *pr

大象大象啥模样。。。 3751

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

基于list.h的简单学生管理系统

      这两天看了linux内核里面经典的list.h文件,看的似懂非懂,心想要是就这样放过去了,过段时间肯定连影子记不起来了,所以决定自己动手试试,能否将这个文件里面的函数和宏应用起来。想法很完美,但时间起来确实费了不少周折,但后来想想收获到的东西,心理感觉还是蛮有成就的。。。好了,具体的过程就不多说了,代码贴出来先~首先是自己定制的"list.h"文件“mylist.h”,(也就是把程序中要用到的宏和函数粘出来另存)。#ifndef _LINUX_LIST_H #define _LINUX_LIS

Hurry up ! 785

Linux内核学习——链表的实现及应用

这学期开了陈莉君老师代的linux内核这门课,周一主要讲了内核中的链表,我这里写篇博客记录一下学习所得。 今天博客里的数据结构和函数都来自2.6内核文件linux-2.6.22.6\include\linux\list.h,参考资料主要是陈老师编写的《Linux操作系统原理与应用》。 这里主要以书上的一个小例子来分析。 代码如下 #include <linux/module.h> #i...

weixin_40746176的博客 361

Linux内核【链表】整理笔记(2) 【转】

转自:http://blog.chinaunix.net/uid-23069658-id-4725279.html 关于链表我们更多时候是对其进行遍历的需求,上一篇博文里我们主要认识了一下和链表操作比较常用的几个内核API接口,其入参全都是清一色的struct list_head{}类型。至于链表的遍历,内核也有一组基本的接口(其实都是宏定义的)供开发者调用。 首先是list_for_...

weixin_34233618的博客 58

漫谈Linux内核哈希表(2)

对照前面介绍过的内核通知链、链表,本章我们将要介绍的哈希表的初始化和定义也是如出一辙的: 点击(此处)折叠或打开 定义并初始化一个名为name的哈希链表表头 #define HLIST_HEAD(name) struct hlist_head name = { ...

weixin_34150503的博客 304

基于linux下的学生管理系统1

#基于linux系统的学生管理系统知识点介绍:程序介绍:以上就是链表部分,虽然没有用内核链表,但是这个链表还是能够实现通用性核心内容结束 作为c语言学习阶段的最终检验,一个管理系统的好坏能比较直接的反应初学者的基础扎实与否。 一个完整且经用的学生管理系统的组成无非就是以下几个方面的知识点 (作者自我介绍:在校大学生一枚,暑假学习了将近一个月的c语言,想作一篇自我总结,一开始成就感还是有的,(后面肯定是挫折感了)看着一个能运行并履行功能的程序,有一种创造者的欣喜,第一次做有很多不足的地方,犯了许多错误,虽然最

Seamenwang的博客 1429

进程概念——Linux

Linux进程基本概念

一些七零八碎的知识点 1万+

【Linux】操作系统及进程概念

Linux操作系统与进程概念

m0_68931081的博客 1万+

c语言

原创 C语言在开发中的应用博文汇总贴 置顶 ...

qq_45596083的博客 322

进程的概念

进程的概念

m0_73096566的博客 1277

嵌入式学习路线全解析:从C语言到Linux驱动开发进阶指南

嵌入式系统开发是软硬件结合的技术领域,其知识体系涵盖从底层硬件操作到操作系统运行的多层结构。C语言作为嵌入式开发的基石,指针、内存管理与数据结构是必须掌握的基础技能。从单片机裸机开发入手,可以直观理解寄存器、中断、定时器与外设总线的工作机制。随着系统复杂度的提升,引入FreeRTOS等实时操作系统实现任务调度与资源管理,再逐步过渡到嵌入式Linux应用与驱动开发,理解进程、线程、设备树与内核模块。这条路径不仅有助于构建完整的系统观,更是通往高薪岗位的实用路线。在工业控制、物联网、汽车电子等场景中,嵌入式Li

weixin_29192211的博客 213
上一篇: c语言指针一点都不难
下一篇: mysql--语法速成手册
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值