数据结构 - 双链表(C++)

// ------DoublyLinkedList.h------

template <class T>
class DNode
{
private:
	// 指向左、右结点的指针
	DNode<T> * left;
	DNode<T> * right;
public:
	// data为公有成员
	T data;
	// 构造函数
	DNode(void);
	DNode(const T& item);
	// 改变表的方法
	void InsertRight(DNode<T> * p);
	void InsertLeft(DNode<T> * p);
	DNode<T> * DeleteNode(void);
	// 取得指向左、右结点的指针
	DNode<T> * NextNodeRight(void) const;
	DNode<T> * NextNodeLeft(void) const;
};
// ------DoublyLinkedList.cpp------

#include "DoublyLinkedList.h"

// 构造函数,创建一个空表,并初始化其data域
template <class T>
DNode<T>::DNode(const T& item)
{
	// 建立一个指向自身的结点并初始化data域
	left = right = this;
	data = item;
}

// 将结点p插入到双向链表中当前结点右边
template <class T>
void DNode<T>::InsertRight(DNode<T> * p)
{
	// 将p和当前结点的右后继结点相连
	p->right = right;
	right->left = p;
	// 将p的左边和当前结点相连
	p->left = this;
	right = p;
}

// 将结点p插入到当前结点左边
template<class T>
void DNode<T>::InsertLeft(DNode<T> * p)
{
	// 将p和当前结点的左后继结点相连
	p->left = left;
	left->right = p;
	// 将p的右边与当前结点相连
	p->right = this;
	left = p;
}

// 从链表中删除当前结点并返回其地址
template <class T>
DNode<T> * DNode<T>::DeleteNode(void)
{
	// 将左结点的右指针指向右结点
	left->right = right;
	// 将右结点的左指针指向左结点
	right->left = left;
	// 返回当前节点指针
	return this;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

转载于:https://www.cnblogs.com/lcchuguo/p/4870630.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双向链表是一种常见的数据结构,与单向链表相比,它每个节点都有两个指针,分别指向前驱节点和后继节点。这样,双向链表可以实现双向遍历,插入和删除操作也更加方便。 以下是用C语言实现双向链表的代码: ```c #include <stdio.h> #include <stdlib.h> // 双向链表节点结构体 typedef struct ListNode { int val; struct ListNode *prev; struct ListNode *next; } ListNode; // 创建双向链表节点 ListNode *createNode(int val) { ListNode *node = (ListNode *)malloc(sizeof(ListNode)); node->val = val; node->prev = NULL; node->next = NULL; return node; } // 插入节点到双向链表头部 ListNode *insertAtHead(ListNode *head, int val) { ListNode *node = createNode(val); if (head == NULL) { head = node; } else { node->next = head; head->prev = node; head = node; } return head; } // 插入节点到双向链表尾部 ListNode *insertAtTail(ListNode *head, int val) { ListNode *node = createNode(val); if (head == NULL) { head = node; } else { ListNode *cur = head; while (cur->next != NULL) { cur = cur->next; } cur->next = node; node->prev = cur; } return head; } // 删除双向链表中的节点 ListNode *deleteNode(ListNode *head, int val) { if (head == NULL) { return NULL; } ListNode *cur = head; while (cur != NULL && cur->val != val) { cur = cur->next; } if (cur == NULL) { return head; } if (cur == head) { head = head->next; if (head != NULL) { head->prev = NULL; } } else { cur->prev->next = cur->next; if (cur->next != NULL) { cur->next->prev = cur->prev; } } free(cur); return head; } // 打印双向链表 void printList(ListNode *head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); } // 主函数 int main() { ListNode *head = NULL; head = insertAtHead(head, 1); head = insertAtHead(head, 2); head = insertAtTail(head, 3); printList(head); // 2 1 3 head = deleteNode(head, 2); printList(head); // 1 3 head = deleteNode(head, 3); printList(head); // 1 head = deleteNode(head, 1); printList(head); // return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值