自定义链表操作:
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);/*删除*/