链式存储-双向链表

双向链表的定义

//双向链表的定义
typedef struct DualNode
{
	ElemType Data;	//数据域
	struct DualNode* prior;	//前驱结点
	struct DualNode* next;	//后继结点
}DualNode,*DuLinkList;

双向链表结点的插入

双向链表结点的插入

s -> prior = p;			//把p赋值给s的前驱,如图①
s -> next = p+1;		//把p->next赋值给s的后继,如图中的②
p -> next ->prior = s;	//将s赋值给p -> next 的前驱
p -> next = s;			//将s赋值给p的后继,如图④

顺序是先搞定s的前驱和后继,再搞定后结点的前驱,最后解决前结点的后继。

双向链表结点的删除

双向链表结点的删除


p -> prior -> next = p -> next;	//将p -> next 赋值给p -> prior 的后继,如图①
p -> next ->prior = p -> prior;	//将p -> prior 赋值给 p ->next 的前驱,如图②
free(p);	//释放结点

代码实例:

#include <stdio.h>
#include <malloc.h>

//定义通用规则
#define OK		1
#define ERROR	0

typedef char ElemType;
typedef int Status;	//状态返回码

//双向链表的定义
typedef struct DualNode
{
	ElemType data;	//数据域
	struct DualNode* prior;	//前驱结点
	struct DualNode* next;	//后继结点
}DualNode,*DuLinkList;

//双向链表的初始化
Status InitList(DuLinkList* L)	//L为头结点(而非头指针)指向指针的指针
{
	//工作指针
	DualNode* p, * q;
	int i;

	*L = (DuLinkList)malloc(sizeof(DualNode));
	if (!(*L))	//内存分配失败
	{
		return ERROR;
	}
	(*L)->next = (*L)->prior = NULL;
	p = *L;

	for (i = 0; i < 26; i++)
	{
		q = (DualNode*)malloc(sizeof(DualNode));
		if (!q)
		{
			return ERROR;
		}

		q->data = 'A' + i;
		q->prior = p;
		q->next = p->next;
		p->next = q;

		p = q;
	}

	//循环执行完毕,p和q均为尾结点
	p->next = (*L)->next;
	(*L)->next->prior = p;
	return OK;
}

void Caesar(DuLinkList* L, int i)
{
	//使用do...while的目的,先将头结点更新为第一个元素所在的结点
	if (i > 0)
	{
		do
		{
			(*L) = (*L)->next;
		} while (--i);
	}
	if (i < 0)
	{
		do
		{
			(*L) = (*L)->next;
		} while (++i);
		//(*L) = (*L)->next;
		//while (++i)
		//{
		//	(*L) = (*L)->prior;
		//}

	}

}

int main()
{
	DuLinkList L;
	int i, n;

	InitList(&L);

	printf("请输入一个整数:");
	scanf("%d", &n);
	Caesar(&L, n);
	printf("\n");

	for (i = 0; i < 26; i++)
	{
		L = L->next;
		printf("%c", L->data);
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链式存储的栈可以通过双向链表来实现。双向链表是一种数据结构,其中每个节点都包含一个指向前驱节点和后继节点的指针。栈是一种具有后进先出(LIFO)特性的数据结构,可以在链表的头部进行插入和删除操作。 下面是使用双向链表实现链式存储的栈的示例代码(使用C++语言): ```cpp #include <iostream> // 定义双向链表节点结构体 struct Node { int data; // 数据 Node* prev; // 前驱节点指针 Node* next; // 后继节点指针 Node(int val) : data(val), prev(nullptr), next(nullptr) {} }; // 定义链式存储的栈类 class Stack { private: Node* top; // 栈顶指针 public: Stack() : top(nullptr) {} // 判断栈是否为空 bool isEmpty() { return top == nullptr; } // 入栈操作 void push(int val) { Node* newNode = new Node(val); if (isEmpty()) { top = newNode; } else { newNode->next = top; top->prev = newNode; top = newNode; } std::cout << val << " 入栈成功!" << std::endl; } // 出栈操作 int pop() { if (isEmpty()) { std::cout << "栈为空,无法进行出栈操作!" << std::endl; return -1; // 返回一个特殊值表示出错 } int val = top->data; Node* temp = top; if (top->next != nullptr) { top = top->next; top->prev = nullptr; } else { top = nullptr; } delete temp; std::cout << val << " 出栈成功!" << std::endl; return val; } // 获取栈顶元素 int getTop() { if (isEmpty()) { std::cout << "栈为空,无法获取栈顶元素!" << std::endl; return -1; // 返回一个特殊值表示出错 } return top->data; } }; int main() { Stack stack; stack.push(10); stack.push(20); stack.push(30); std::cout << "栈顶元素为:" << stack.getTop() << std::endl; stack.pop(); stack.pop(); std::cout << "栈顶元素为:" << stack.getTop() << std::endl; stack.pop(); return 0; } ``` 这个示例中,我们使用双向链表的头部作为栈顶,并且在入栈操作时将新节点插入链表的头部,出栈操作时删除链表的头部节点。通过双向链表的前驱和后继指针,我们可以方便地在链表头部进行插入和删除操作,并且可以随时获取栈顶元素。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值