我们知道,内核链表是双向链表,在这里不详细介绍内核链表的概念,只列出demo并附上注释供需要的同学参考。
下面使用内核链表完成基本的增删改查,实现简易的学生信息管理系统,拥有保存信息到txt文本的功能,和从txt中读取信息的功能。(内核链表的头文件可以百度直接下载)
#include"kernel_list.h" //内核链表的头,只需加入内核链表的c文件,一起编译即可运行该程序
#include
#include
#include
#include //fopen函数
#include
//结构体
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;
}