链表操作:尾插法

 自定义链表操作:

static PT_DispOpr g_ptInputOprHead;  /*定义链表头*/

/*尾插链表*/
int RegisterOpr(PT_DispOpr ptDispOpr)
{
	PT_DispOpr ptTmp;

	if (!g_ptDispOprHead)     //如果链表为空 则将ptDispOpr放到表头
	{
		g_ptDispOprHead   = ptDispOpr;
		ptDispOpr->ptNext = NULL;
	}
	else
	{
		ptTmp = g_ptDispOprHead;
		while (ptTmp->ptNext)    //如果ptTmp->ptNext= NULL 则找到表尾
		{
			ptTmp = ptTmp->ptNext; //遍历表
		}
        // 找到表尾后
		ptTmp->ptNext	  = ptDispOpr;   
		ptDispOpr->ptNext = NULL;
	}

	return 0;
}
/*查询链表*/
PT_DispOpr GetDispOpr(char *pcName)
{
	PT_DispOpr ptTmp = g_ptDispOprHead;
	
	while (ptTmp)
	{
		if (strcmp(ptTmp->name, pcName) == 0)
		{
			return ptTmp;
		}
		ptTmp = ptTmp->ptNext;
	}
	return NULL;
}

linux的kernel的链表函数:

/*参考 uvc_drver*/
/*双向链表*/

/*定义列表里面的项:结构体(如果是结构体链表)*/
struct myuvc_buffer {
	struct v4l2_buffer buf;/*一块缓存*/
	int state;
	int vma_use_conut; /*表示是否已经被mmap  ,初始值为0,mmapp一次就加1*/
	wait_queue_head_t wait; /*APP要读某个缓冲区,如果无数据,在此休眠*/
	struct list_head stream;  /*要包含这一项 !!!*/
	int error;
};

struct list_head mainqueue; /*定义链表*/

INIT_LIST_HEAD(&my_queue.mainqueue); /*初始化链表*/

list_add_tail(&buf->stream,&my_queue.mainqueue); /*尾插,也有头插函数*/


struct myuvc_buffer *buf;
buf = list_first_entry(&my_queue.mainqueue, struct myuvc_buffer, stream);
/*遍历第一个stream项,返回myuvc_buffer类型指针*/


list_del(&buf->stream);/*删除*/

参考:linux kernel 中双向链表详解(一)_list_first_entry-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值