双向循环链表(含头节点)
Github代码链接: Data_Structure_Learning/Double List at master
1、创建双向循环链表
(1)创建链表 == 创建头节点
/* ① 定义创建链表的函数 */ LIST_HEAD_S* TEST_list_Create(int initsize) { LIST_HEAD_S* pstHeadNode = NULL; pstHeadNode = (LIST_HEAD_S*)malloc(sizeof(LIST_HEAD_S)); if (NULL == pstHeadNode) { return NULL; } pstHeadNode->size = initsize; pstHeadNode->head.data = NULL; pstHeadNode->head.prev = &pstHeadNode->head; pstHeadNode->head.next = &pstHeadNode->head; return pstHeadNode; }
(2)插入普通数据节点
/* ③ 定义链表添加节点的函数 */ int TEST_list_Insert(LIST_HEAD_S* List, void * data) { LIST_NODE_S* pstNewnode; pstNewnode = (LIST_NODE_S *)malloc(sizeof(*pstNewnode)); pstNewnode->data = malloc(List->size); memcpy(pstNewnode->data, data, List->size); /* 以首部插入方式 */ pstNewnode->next = List->head.next; pstNewnode->prev = &List->head; pstNewnode->prev->next = pstNewnode; pstNewnode->next->prev = pstNewnode; return 0; }
2、遍历双向循环链表
list.c文件中定义遍历函数
/* ④ 定义遍历链表节点的函数 */ void TEST_list_Display(LIST_HEAD_S* pstList, llist_callback* print_Func) { LIST_NODE_S* pstCurNode; for (pstCurNode = pstList->head.next; &pstList->head != pstCurNode; pstCurNode = pstCurNode->next) { print_Func(pstCurNode->data); } }
main.c中定义打印函数print_Func
void Score_print_Func(const void * score) { const LIST_SCORE_S* temp = (LIST_SCORE_S *) score; printf("学生的学号是%d,姓名是%s,数学成绩是%d\n",temp->stuID,temp->name,temp->math); }
3、双向循环链表查找元素
list.c文件中定义查找函数
void TEST_list_Find(LIST_HEAD_S* llist, llist_idfind* idfind_Func,int *stuID) { LIST_NODE_S* curnode; for (curnode = llist->head.next; &llist->head != curnode; curnode = curnode->next) { idfind_Func(curnode->data,stuID); } }
main.c文件中定义匹配函数
void Score_idFind_Func(const void *score,int *stuID) { const LLIST_SCORE_S* temp = (LLIST_SCORE_S*)score; if (temp->stuID == *stuID) printf("找到了学号为%d的学生,学生姓名为%s,学生数学成绩为%d\n", temp->stuID,temp->name,temp->math); }
4、销毁双向循环链表
void TEST_list_Destroy(LIST_HEAD_S* pstList) { LIST_NODE_S* pstCurNode; LIST_NODE_S* pstNextNode = NULL; for (pstCurNode = pstList->head.next; pstCurNode != &pstList->head; pstCurNode = pstNextNode) { pstNextNode = pstCurNode->next; free(pstCurNode->data); free(pstCurNode); } free(pstList); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY