1.找到linux的内核链表所在位置:
(1)一般在linux内核源码包解压后的:
X:\linux-5.8.8\include\linux目录下:
存在这list.h文件,该头文件是调用内核链表的头文件,所以使用时需要添加文件到本地,或者以绝对路径进行调用。
这里就不展开说明了,(其实list.h的每个函数都有英文的注释说明,多读该头文件,从该头文件中可以学到很多对于链表的使用和借鉴之处)如下是头文件中所有的函数名:
从上面的函数名中通常可以,见名知意。大致了解起作用。
2.简单应用程序框架:
(1)定义用例的结构体(这里以航班为例):
typedef struct f
{
char id[10],qi[10],zd[10],ys[10],bc[10];
//航班号 起飞 终点 用时 班次
int jg;//价格
}fly;
typedef struct n
{
fly a;//数据
struct list_head b;//指针
}l,*li;
(2)对链表节点的初始化(这里为了方便记忆和区分,我就以简单的标识进行展开)
li chu()
{
li q=malloc(sizeof(l));
if(q!=NULL)
{
INIT_LIST_HEAD(&q->b);//节点初始化
}
return q;
}
(3)这里只是添加要输入的信息
li input()//输入
{
li x=malloc(sizeof(l));
if(x!=NULL)
{
printf("请输入--航班号--起飞站---终点站--用时---班次---价格\n");
scanf("%s%s%s%s%s%d",x->a.id,x->a.qi,x->a.zd,x->a.ys,x->a.bc,&(x->a.jg));
}
x->b.prev=NULL;
x->b.next=NULL;
return x;
}
(4)插入:(使用的是尾插法进行的插入)同时在in.txt文件中添加插入的数据信息。
void rtxt(li m)
{
FILE *f=fopen("in.txt","r+");
while(1)
{
li n=malloc(sizeof(l));
if(fscanf(f,"%s%s%s%s%s%d\n",n->a.id,n->a.qi,n->a.zd,n->a.ys,n->a.bc,&n->a.jg)==EOF)break;
list_add_tail(&(n->b),&(m->b));
}
fclose(f);
}
(5)打印输出信息:
void show(li m)//显示
{
int i=0;
li x;
list_for_each_entry(x,&(m->b),b)
{
printf("--航班号--起飞站---终点站--用时---班次---价格\n");
printf("-- %s -- %s ---- %s --- %s --- %s --- %d\n",
x->a.id,x->a.qi,x->a.zd,x->a.ys,x->a.bc,x->a.jg);
}
}
(6)删除节点
void del(li m)//删除
{
char o[10];
li p;
printf("请输入要删除的航班号:\n");
scanf("%s",o);
list_for_each_entry(p,&(m->b),b)
{
if(strcmp(p->a.id,o)==0)
break;
}
list_del(&(p->b));
}
(7)查询节点信息
void find(li m)//查询
{
char o[10];
li p;
printf("请输入要查询的航班号:\n");
scanf("%s",o);
list_for_each_entry(p,&(m->b),b)
{
if(strcmp(p->a.id,o)==0)
{printf("--航班号--起飞站---终点站--用时---班次---价格\n");
printf("-- %s -- %s ---- %s --- %s --- %s --- %d\n",
p->a.id,p->a.qi,p->a.zd,p->a.ys,p->a.bc,p->a.jg);
}
}
}
(8)进行排序处理(这里没用到复杂的排序,这块的排序问题可以交流讨论)
void pai(li m)//排序
{
li x;
li y;
fly j;
list_for_each_entry(x,&(m->b),b)
{
for(y=list_entry(&(m->b),l,b);&y->b != &x->b;y=list_entry(y->b.next,l,b))
{
if(y->a.jg> x->a.jg)
{
j=y->a;
y->a=x->a;
x->a=j;
}
}
}
}
(9)调用函数:
#include<stdio.h>
#include<string.h>
#include"list.h"
#include<stdlib.h>
#include "str_list.h"
int main()
{
li m=chu();
li z;
int w;
while(1)
{
printf("----------------------------------------\n");
printf("——————————————————*航班查询系统————————————————————\n");
printf("********************************************\n");
printf("0.文本导入\n");
printf("1.显示航班\n");
printf("2.添加航班\n");
printf("3.删除航班\n");
printf("4.查询航班\n");
printf("5.排序航班\n");
printf("6.退出系统\n");
printf("-----------------------------------------\n");
scanf("%d",&w);
switch(w)
{
case 0:rtxt(m);break;
case 1:show(m);break;
case 2:z=input();list_add_tail(&(z->b),&(m->b));break;
case 3:del(m);break;
case 4:find(m);break;
case 5:pai(m);break;
case 6:return-1;break;
default :break;
}
}
return 0;
}
内核链表这里其中的很多函数都还没用到,不过相比单链表,双向循环链表,内核链表就方便的多了,只需理解并调用即可。(但单链表至少需要我们掌握)