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

内核链表

  我们知道,内核链表是双向链表,在这里不详细介绍内核链表的概念,只列出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交流,一起进步,或者在我的公众号底下留言,我会第一时间回复

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值