双向带头循环链表的实现(C语言实现)(基本增删改查)

双向带头循环链表的实现

双向带头循环链表

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;
}
发布了117 篇原创文章 · 获赞 48 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gp1330782530/article/details/104697598