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