当前位置: 首页 > news >正文

数据 结构(内核链表)

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

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


http://www.mrgr.cn/news/20690.html

相关文章:

  • 高职院校全栈式信创实训基地解决方案
  • .NET 8月份红队武器库和资源集合
  • 机器学习之 PCA降维
  • 详细分析TypeScript 中的可选参数与属性:用问号 ? 提升代码灵活性
  • 同构字符串算法应用
  • vue3 项目中使用git
  • 2024-WK35-前沿技术动态
  • 团队动力之团队发展阶段理论
  • Adobe Photoshop发展简史及下载
  • 深入浅出:使用Spring Boot实现AOP切面编程
  • 傅里叶变换家族
  • 问:说说Java中有哪些IO流吧?
  • Python知识点:如何使用Slack与Python进行团队协作
  • 华为OD机试 - 最优结果的a数组数量 - 贪心思维(Java 2024 E卷 100分)
  • 【微机】DOSBox在windows上的安装和masm的配置
  • 计算机网络基础 - 应用层(2)
  • 认知杂谈48
  • 华为OD机试真题-猜字谜-2024年OD统一考试(E卷)
  • 每日一练5:最小花费爬楼梯(含链接)
  • 今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月6日,星期五