双向循环链表(含头节点)

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

 

posted @   轩~邈  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示