1. 程式人生 > >帶頭雙向迴圈連結串列

帶頭雙向迴圈連結串列

#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
typedef int DataType;
typedef struct DNode
{
	DataType data;
	struct DNode *next;
	struct DNode *prev;
}DNode;
DNode *CreateDNode(int data)
{
	DNode *node = (DNode*)malloc(sizeof(DNode));
	node->data = data;
	node->prev = node->next = NULL;
	return node;
}
void DNodeInit(DNode **ppHead)
{
	assert(ppHead != NULL);
	DNode *node = CreateDNode(0);
	node->next = node;
	node->prev = node;
	*ppHead = node;
}
void DNodePushFront(DNode *head,DataType data)
{
	DNode *node = CreateDNode(0);
	node->prev = head;
	node->next = head->next;
	head->next->prev = node;
	head->next = node;
}
void DNodePushBack(DNode *head,DataType data)
{
	DNode *node = CreateDNode(0);
	node->prev = head->prev;
	node->next;
	node = head->prev->next;
	head->prev = node;

}
void DListInsert(DNode *head, DataType data)
{
	DNode *node = CreateDNode(data);
	node->prev = head->prev;
	node->next = head;
	head->prev->next = node;
	head->prev = node;

}
void DListPopFront(DNode *head)
{
	assert(head->next != head);
	DNode *first = head->next;
	DNode *second = head->next->next;
	head->next = second;
	second->prev = head;
	head->next = head;
	
}
void DListPopBack(DNode *head)
{
	assert(head->next != head);
	DNode *node;
	node->prev->next = head;
	head->prev = node->prev;
	free(node);
}
void DListErase(DNode *head, DNode *pos)
{
	assert(head->next != head);
	pos->prev->next = pos->next;
	pos->next->prev = pos->prev;
	free(pos);
}
void DListClear(DNode *head)
{
	DNode *next;
	for (DNode *cur = head->next; cur != head; cur = next)
	{
		next = cur->next;
		free(cur);
	}
	head->prev = head->next = head;
}
void DNodePrintf(DNode *head)
{
	for (DNode *cur = head->next; cur != head; cur = cur->next)
	{
		printf("%d", cur->data);
	}
	printf("\n");
}
void Test()
{
	DNode *List;
	DNodeInit(&List);
	DNodePushBack(List, 1);
	DNodePushBack(List, 2);
	DNodePushBack(List, 3);
	DNodePushBack(List, 4);
	DNodePushBack(List, 5);
	DNodePrintf(List);

}

雙向帶頭迴圈連結串列時間複雜度O(1),因為是迴圈首位相接,不管是頭,尾相加節點都可以直接確定位置,並不需要遍歷(除去clear,和列印連結串列必須要遍歷連結串列)。

我們在增刪查改雙向帶頭連結串列時候,需要注意的是該表head,最後節點
的指向,以及將原有指向關係換成新的指向關係。注意增刪改查,對
連結串列指向關係改變的影響這個是關鍵,也是需要注意的。**以及我們
需要注意在clear不能刪除頭節點,在節點修改時候,我們需要保證頭
節點安全,不能破環這個,匿名如果簡單實現迴圈帶頭雙鏈表為題會
簡單很多的。