欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

带头双向循环链表的增删查改

程序员文章站 2024-03-22 14:30:28
...

头文件

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

typedef int LTdAateType;
typedef struct ListNode
{
	LTdAateType data;
	struct  ListNode *next;
	struct ListNode *prev;
}ListNode;

//初始化链表
ListNode *InitListNode();

//尾插链表
void ListPushBack(ListNode* plist, LTdAateType x);

// 双向链表打印
void ListPrint(ListNode* plist);

// 双向链表头插
void ListPushFront(ListNode* plist, LTdAateType x);

// 双向链表尾删
void ListPopBack(ListNode* plist);

// 双向链表头删
void ListPopFront(ListNode* plist);

// 双向链表查找
ListNode* ListFind(ListNode* plist, LTdAateType x);

// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTdAateType x);

// 双向链表删除pos位置的节点
void ListErase(ListNode* pos);

实现

#include "List.h"

//新建节点
ListNode *BuyListNode(LTdAateType x)
{
	ListNode *NewNode = (struct ListNode*)malloc(sizeof(struct ListNode));
	NewNode->data = x;
	NewNode->next = NULL;
	NewNode->prev = NULL;

	return NewNode;
}

//初始化链表
ListNode *InitListNode()
{
	ListNode *phead = BuyListNode(0);
	phead->next = phead;
	phead->prev = phead;
	return phead;
}

//尾插链表
void ListPushBack(ListNode* plist, LTdAateType x)
{
	assert(plist);

	ListNode *tail = plist->prev;
	ListNode *Newnode = BuyListNode(x);

	tail->next = Newnode;
	Newnode->next = plist;
	Newnode->prev = tail;
	plist->prev = Newnode;

}

// 双向链表打印
void ListPrint(ListNode* plist)
{
	assert(plist);

	ListNode *cur = plist->next;
	while (cur != plist)
	{
		printf("%d ", cur->data);
		cur = cur->next;
	}
	printf("\n");
}

// 双向链表头插
void ListPushFront(ListNode* plist, LTdAateType x)
{
	assert(plist);

	ListNode *first = plist->next;
	ListNode *newnode = BuyListNode(x);
	newnode->next = first;
	newnode->prev = plist;
	plist->next = newnode;
	first->prev = newnode;

}

// 双向链表尾删
void ListPopBack(ListNode* plist)
{
	assert(plist);
	assert(plist->next != plist);

	ListNode *tail = plist->prev;

	plist->prev = tail->prev;
	(tail->prev)->next = plist;

	free(tail);
}

// 双向链表头删
void ListPopFront(ListNode* plist)
{
	assert(plist);
	assert(plist->next != plist);

	ListNode *del = plist->next;
	ListNode *delnext = del->next;
	delnext->prev = plist;
	plist->next = delnext;

	free(del);
}

// 双向链表查找
ListNode* ListFind(ListNode* plist, LTdAateType x)
{
	assert(plist);

	ListNode *cur = plist->next;
	while (cur != plist)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTdAateType x)
{
	assert(pos);

	ListNode *newnode = BuyListNode(x);
	newnode->next = pos;
	(pos->prev)->next = newnode;
	newnode->prev = (pos->prev);
	pos->prev = newnode;

}

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

	ListNode *prev = pos->prev;
	ListNode *next = pos->next;

	prev->next = next;
	next->prev = prev;

}