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

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 @ 2022-10-08 22:50  轩~邈  阅读(39)  评论(0编辑  收藏  举报