双向带头循环链表的实现
双向带头循环链表
typedef struct ListNode
{
DLDataType data;
struct ListNode *_next;
struct ListNode *_prev;
}ListNode;
typedef struct List
{
ListNode *_head;
}List;
DList.h
#ifndef _DLIST_H_
#define _DLIST_H_
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
typedef int DLDataType;
typedef struct ListNode
{
DLDataType data;
struct ListNode *_next;
struct ListNode *_prev;
}ListNode;
typedef struct List
{
ListNode *_head;
}List;
//为x申请结点
ListNode* BuyListNode(DLDataType x);
//初始化
void DListInit(List *plist);
//销毁
void DListDestory(List *plist);
//尾插
void DListPushBack(List *plist, DLDataType x);
//尾删
void DListPopBack(List *plist);
//头插
void DListPushFront(List *plist, DLDataType x);
//头删
void DListPopFront(List *plist);
//查找元素
ListNode* DListFind(List *plist, DLDataType x);
//在pos位置之前插入
void DListInsertBefore(List *plist, ListNode *pos, DLDataType x);
//在pos之后插入
void DListInsertAfter(List *plist, ListNode *pos, DLDataType x);
//删除pos位置结点
void DListErasePos(List *plist, ListNode *pos);
//删除元素x
void DListEraseX(List *plist, DLDataType x);
//修改pos位置元素为x
void DListModify(List *plist, ListNode *pos, DLDataType x);
//打印双向带头循环链表
void DListPrint(List *plist);
#endif //_DLIST_H_
DList.c
#include "DList.h"
//为x申请结点
ListNode* BuyListNode(DLDataType x)
{
ListNode *listnode = (ListNode *)malloc(sizeof(ListNode));
if (listnode == NULL)
{
return NULL;
}
listnode->data = x;
listnode->_prev = NULL;
listnode->_next = NULL;
return listnode;
}
//初始化
void DListInit(List *plist)
{
assert(plist);
ListNode *_head = BuyListNode(0);
plist->_head = _head;
plist->_head->_prev = plist->_head;
plist->_head->_next = plist->_head;
}
//销毁
void DListDestory(List *plist)
{
assert(plist->_head);
ListNode *cur = plist->_head->_next;
while (cur != plist->_head)
{
ListNode *tmp = cur->_next;
free(cur);
cur = tmp;
}
free(plist->_head);
plist->_head = NULL;
}
//尾插
void DListPushBack(List *plist, DLDataType x)
{
assert(plist->_head);
ListNode *node = BuyListNode(x);
ListNode *cur = plist->_head->_prev;
cur->_next = node;
node->_prev = cur;
plist->_head->_prev = node;
node->_next = plist->_head;
}
//尾删
void DListPopBack(List *plist)
{
assert(plist->_head);
ListNode *cur = plist->_head->_prev;
cur->_next->_prev = cur->_prev;
cur->_prev->_next = cur->_next;
free(cur);
cur = NULL;
}
//头插
void DListPushFront(List *plist, DLDataType x)
{
assert(plist->_head);
ListNode *node = BuyListNode(x);
ListNode *cur = plist->_head->_next;
cur->_prev = node;
node->_next = cur;
plist->_head->_next = node;
node->_prev = plist->_head;
}
//头删
void DListPopFront(List *plist)
{
assert(plist->_head);
ListNode *cur = plist->_head->_next;
cur->_prev->_next = cur->_next;
cur->_next->_prev = cur->_prev;
free(cur);
cur = NULL;
}
//查找元素
ListNode* DListFind(List *plist, DLDataType x)
{
assert(plist->_head);
for (ListNode *cur = plist->_head->_next; cur != plist->_head; cur = cur->_next)
{
if (cur->data == x)
{
return cur;
}
}
return NULL;
}
//在pos位置之前插入
void DListInsertBefore(List *plist, ListNode *pos, DLDataType x)
{
assert(plist->_head);
ListNode *node = BuyListNode(x);
ListNode *cur = pos->_next;
cur->_prev = node;
node->_next = cur;
plist->_head->_next = node;
node->_prev = plist->_head;
}
//在pos之后插入
void DListInsertAfter(List *plist, ListNode *pos, DLDataType x)
{
assert(plist->_head);
ListNode *node = BuyListNode(x);
ListNode *cur = pos->_prev;
cur->_next = node;
node->_prev = cur;
plist->_head->_prev = node;
node->_next = plist->_head;
}
//删除pos位置结点
void DListErasePos(List *plist, ListNode *pos)
{
assert(plist->_head);
ListNode *cur = pos->_prev;
cur->_next->_prev = cur->_prev;
cur->_prev->_next = cur->_next;
free(cur);
cur = NULL;
}
//删除元素x
void DListEraseX(List *plist, DLDataType x)
{
assert(plist->_head);
ListNode *pos = DListFind(plist, x);
ListNode *cur = pos->_prev;
cur->_next->_prev = cur->_prev;
cur->_prev->_next = cur->_next;
free(cur);
cur = NULL;
}
//修改pos位置元素为x
void DListModify(List *plist, ListNode *pos, DLDataType x)
{
assert(plist->_head);
DListInsertBefore(plist, pos, x);
DListErasePos(plist, pos->_next);
}
//打印双向带头循环链表
void DListPrint(List *plist)
{
assert(plist->_head);
printf(" plist->_head ");
for (ListNode *cur = plist->_head->_next; cur != plist->_head; cur = cur->_next)
{
printf("<==> %d ", cur->data);
}
printf("<==> plist->_head \n");
}
main.c
#include "DList.h"
int main()
{
List list;
DListInit(&list);
DListPushBack(&list, 1);
DListPushBack(&list, 2);
DListPushBack(&list, 3);
DListPushBack(&list, 4);
DListPushBack(&list, 5);
DListPushBack(&list, 6);
DListPushBack(&list, 7);
DListPushBack(&list, 8);
DListPushBack(&list, 9);
DListPushBack(&list, 10);
DListPrint(&list);
DListPopBack(&list);
DListPrint(&list);
DListPushFront(&list, 10);
DListPrint(&list);
DListPopFront(&list);
DListPrint(&list);
ListNode *pos = DListFind(&list, 3);
printf("%p\n", pos);
DListInsertBefore(&list, pos, 4);
DListPrint(&list);
DListInsertAfter(&list, pos, 2);
DListPrint(&list);
DListErasePos(&list, pos);
DListPrint(&list);
DListEraseX(&list, 9);
DListPrint(&list);
DListModify(&list, pos, 3);
DListPrint(&list);
DListDestory(&list);
system("pause");
return 0;
}