一.关于linux内核链表的简单应用。

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;
}

内核链表这里其中的很多函数都还没用到,不过相比单链表,双向循环链表,内核链表就方便的多了,只需理解并调用即可。(但单链表至少需要我们掌握)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值