【数据结构】2.3 双向循环链表

目录

一、学习路线图

二、双向链表的优点

三、双向循环链表的存储结构

四、双向链表基本操作的代码实现

1.链表的初始化

 2.创建头结点

3.打印(遍历链表)

4.尾插法

5.头插法

6.尾删法

7.头删法

8.双向链表在pos的前面进行插入

9.双向链表删除pos位置的节点


 

 

一、学习路线图

【数据结构】2.3 双向循环链表_第1张图片

 

二、双向链表的优点

【数据结构】2.3 双向循环链表_第2张图片

【数据结构】2.3 双向循环链表_第3张图片

 

三、双向循环链表的存储结构

typedef int LTDatatype;
typedef struct ListNode
{
	struct ListNode* next;//下一个
	struct ListNode* prev;//上一个
	LTDatatype data;      //数据域


}ListNode;//直接带变量名ListNode 
		 //相当于struct ListNode ListNode最后一个是结构体变量的名字

【数据结构】2.3 双向循环链表_第4张图片

四、双向链表基本操作的代码实现

1.链表的初始化

ListNode* ListNodeInit(LTDatatype x)
{
	ListNode* node= (ListNode*)malloc(sizeof(ListNode));
	node->data = x;
	node->next = NULL;
	node->prev = NULL;
	return node;
}

 2.创建头结点

ListNode* CreateHead()
{
	ListNode* head = (ListNode*)malloc(sizeof(ListNode));
	head->next = head;
	head->prev = head;
	return head;
}

3.打印(遍历链表)

void ListPrint(ListNode* pHead)
{
	ListNode* cur = pHead->next;
	while (cur != pHead)//cur = pHead的时候退出循环
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("\n");
}

4.尾插法

void ListPushBack(ListNode* pHead, LTDatatype x)//尾插法
{
	ListNode* newnode = ListNodeInit(x);
	//head tail newnode 互相进行链接
	ListNode* tail = pHead->prev;
        newnode->next = pHead;
	tail->next = newnode;//tail的next指向newnode
	newnode->prev = tail;
	pHead->prev = newnode;
}

【数据结构】2.3 双向循环链表_第5张图片

 

5.头插法

void ListPushFront(ListNode* pHead, LTDatatype x)//头插
{
	ListNode* newnode = BuyListNode(x);
	ListNode* first = pHead->next;
	pHead->next = newnode;
	newnode->prev = pHead;
	newnode->next = first;
	first->prev = newnode;
}

【数据结构】2.3 双向循环链表_第6张图片

6.尾删法

void ListPopBack(ListNode* pHead)//尾删
{
	//删除tail
	ListNode* tail = pHead->prev;
	ListNode* tailPrev = tail->prev;
	tailPrev->next = pHead;
	pHead->prev = tailPrev;
	free(tail);
	//ListErase(pHead->prev);   //复用Erase
}



7.头删法

void ListPopFront(ListNode* pHead)//头删
{
	ListNode* first = pHead->next;
	ListNode* second = first->next;
	pHead->next = second;
	second->prev = pHead;
	free(first);
	//ListErase(pHead->next); //复用Erase
}


8.双向链表在pos的前面进行插入

// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDatatype x)
{
	ListNode* newnode = BuyListNode(x);
	ListNode* prev = pos->prev;
	prev->next = newnode;
	newnode->prev = prev;
	newnode->next = pos;
	pos->prev = newnode;
}

9.双向链表删除pos位置的节点

// 双向链表删除pos位置的节点
void ListErase(ListNode* pos)
{
	assert(pos);
	ListNode* prev = pos->prev;

	ListNode* next = pos->next;
	prev->next = next;
	next->prev = prev;
	free(pos);


}

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(数据结构)