当前位置: 首页> 房产> 市场 > 数据 结构(内核链表)

数据 结构(内核链表)

时间:2025/7/13 8:46:56来源:https://blog.csdn.net/m0_71459026/article/details/141939844 浏览次数:0次

一、内核链表(是一个有头双向循环链表)

1.内核提供的两个宏

(1) offsetof : 获取结构体成员到结构体开头的偏移量;

(2) contianer_of : 通过偏移量获取结构体首地址;

2.代码示例:

truct passager *create_passager(char *name, int flt_num, int sit_num, char card)
{struct passager *p = malloc(sizeof(struct passager));if (NULL == p){perror("fail malloc");return NULL;}strcpy(p->name, name);p->flt_num = flt_num;p->sit_num = sit_num;p->card = card;return p;
}struct flight *create_flight(int flt_num,char *src,char *dst)
{struct flight *p = malloc(sizeof(struct flight));if(NULL == p){perror("fail malloc\n");return NULL;}p->flt_num = flt_num;strcpy(p->src,src);strcpy(p->dst,dst);return p;
}KLink_t *create_klink()
{KLink_t *pklink = malloc(sizeof(KLink_t));if (NULL == pklink){perror("fail malloc");return NULL;}pklink->phead = NULL;pklink->clen = 0;pthread_mutex_init(&(pklink->mutex), NULL);return pklink;
}int push_klink_head(KLink_t *pklink, void *p)
{KNode_t *pnode = (KNode_t *)p;pnode->pnext = NULL;pnode->ppre = NULL;pnode->pnext = pklink->phead;if (pklink->phead != NULL){pklink->phead->ppre = pnode;}pklink->phead = pnode;pklink->clen++;return 0;
}int push_klink_tail(KLink_t *plink, void *p)
{KNode_t *pnode = (KNode_t *)p;pnode->pnext = NULL;pnode->ppre = NULL;if (plink->phead == NULL){plink->phead = pnode;}else{KNode_t *p = plink->phead;while (p->pnext != NULL){p = p->pnext;}p->pnext = pnode;pnode->ppre = p;}plink->clen++;return 0;
}void klink_for_each(KLink_t *pklink, void (*pfun)(void *))
{KNode_t *pnode = pklink->phead;while (pnode != NULL){pfun(pnode);pnode = pnode->pnext;}
}
KNode_t *find_klink(KLink_t *pklink, void *t, CMP_t pfun)
{KNode_t *pnode = pklink->phead;while (pnode != NULL){if (pfun(t, pnode)){return pnode;}pnode = pnode->pnext;}return NULL;
}int is_empty_klink(KLink_t *pklink)
{return NULL == pklink->phead;
}int pop_klink_head(KLink_t *pklink)
{if (is_empty_klink(pklink))return 0;KNode_t *pdel = pklink->phead;pklink->phead = pdel->pnext;if (pklink->phead != NULL){pklink->phead->ppre = NULL;}free(pdel);pklink->clen--;return 1;
}void destroy_klink(KLink_t *pklink)
{while (!is_empty_klink(pklink)){pop_klink_head(pklink);}free(pklink);
}

关键字:数据 结构(内核链表)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: