双向循环链表的实现 菜鸟都能看懂的教程

带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向 循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而 简单了,后面我们代码实现了就知道了。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct ListNode    //结点定义
{
	struct ListNode *next;
	struct ListNode *prev;
	int data;
}ListNode;
typedef	struct List    //链表定义
{
	ListNode * head;
}List;


void initList(List * plist)    //链表初始化
{
	plist->head = (ListNode*)malloc(sizeof(ListNode));
	plist->head->data = 0;
	plist->head->next = plist->head;
	plist->head->prev = plist->head;

}
void ListDestory(List * plist)   //销毁链表
{
	ListNode *tmp = plist->head->next;
	while (tmp != plist->head)
	{
		plist->head->next = tmp->next;
		tmp->next->prev = plist->head;
		free(tmp);
		tmp = plist->head->next;
	}
	free(plist->head);
	plist->head = NULL;
}

void ListPushFront(List * plist,int x)
{
	ListNode * cur = (ListNode*)malloc(sizeof(ListNode));
	cur->data = x;

	cur->next = plist->head->next;
	plist->head->next->prev = cur;
	plist->head->next = cur;
	cur->prev = plist->head;

}
void ListPopFront(List * plist)
{
	ListNode * tmp = plist->head->next;
	if (tmp != plist->head)
	{
		plist->head->next = tmp->next;
		tmp->next->prev = plist->head;
		free(tmp);
	}
}
void  PushBack(List* plist, int x)
{
	ListNode * cur = (ListNode*)malloc(sizeof(ListNode));
	cur->data = x;

	cur->prev = plist->head->prev;
	plist->head->prev->next = cur;
	cur->next = plist->head;
	plist->head->prev = cur;
}
void PopBack(List * plist)
{
	ListNode * tmp = plist->head->prev;
	if (tmp != plist->head)
	{
		tmp->prev->next = plist->head;
		plist->head->prev = tmp->prev;
		free(tmp);

	}
}



void print(List *plist)
{
	ListNode * cur;
	printf("head<-->");
	for (cur = plist->head->next; cur != plist->head; cur = cur->next)
	{
		printf("%d<-->", cur->data);
	}
	printf("head\n");
}
int main()
{
	List list;
	initList(&list);
	ListPushFront(&list, 7);
	ListPushFront(&list, 6);
	ListPushFront(&list, 5);
	ListPushFront(&list, 4);
	ListPushFront(&list, 3);
	ListPopFront(&list);
	//ListPopBack(&list);
	print(&list);

	system("pause");
	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值