c++双链表的各种操作(快慢指针,,双链表的创建,翻转双链表等)

#include<iostream>
using namespace std;
typedef struct Node {
	int data;//数据域
	struct Node* next;//后置指针
	struct Node* prior;//前向指针
}Dnode,*DlinkList;
bool initList(DlinkList&);//初始化链表链表
bool createlist(DlinkList);//创建链表
bool showList(DlinkList);//打印双链表的内容
bool insetList(DlinkList,int&, int);//在双链表中插入结点
bool reverseList(DlinkList);//翻转双链表
bool findMidList(DlinkList, int &);//寻找双链表中间位置
int main()
{
	printf("**********************************\n");
	DlinkList L;
	int value = 0;
	int data;
	initList(L);
	createlist(L);
	printf("**********************************\n");
	showList(L);
	insetList(L, value, 2);
	printf("**********************************\n");
	showList(L);
	printf("**********************************\n");
	reverseList(L);
	showList(L);
	printf("**********************************\n");
	findMidList(L, data);
	printf("%d", data);
	printf("**********************************\n");

	return 0;
}
bool findMidList(DlinkList L, int &value) {
	if (L == nullptr)
		return false;
	Dnode* quickPointer = L->next;//快指针
	Dnode* slowPointer = L->next;//慢指针

	while (quickPointer != nullptr) {
		quickPointer = quickPointer->next;
		if (quickPointer != nullptr)
			quickPointer = quickPointer->next;
		slowPointer = slowPointer->next;
	}

	value = slowPointer->prior->data;
	return true;
}
bool reverseList(DlinkList L) {
	if (L == nullptr)
		return false;
	Dnode* head = L->next;
	Dnode* node = head->next;
	Dnode* temp = node;
	head->next = nullptr;

	while (temp != nullptr) {
		temp = temp->next;//头插法翻转双链表
		node->next = head;
		head->prior = node;
		L->next = node;
		node->prior = L;
		head = node;
		node = temp;
	}

	return true;
}
bool insetList(DlinkList L, int& value, int position) {
	if (L == nullptr || position < 0)
		return false;
	int a = 0;//游标
	Dnode* node = L->next;
	while (L != nullptr && a < position - 1) {//找到需要插入位置的前一个位置
		a++;
		node = node->next;
	}

	Dnode* newNode = new Dnode;//建立链接关系
	newNode->data = value;
	newNode->next = node->next;
	newNode->prior = node;
	node->next = newNode;

	return true;
}
bool showList(DlinkList L) {
	if (L == nullptr)
		return false;
	Dnode* node = L->next;
	while (node != nullptr) {
		printf("打印结点的数据:%d\n",node->data);
		node = node->next;
	}

	return true;
}
bool createlist(DlinkList L) {
	if (L == nullptr)
		return false;
	int data;
	Dnode* temp = L;
	printf("请输入结点数据:");
	scanf_s("%d", &data);
	while (data != 9999) {//输入的数据为9999时表示停止创建链表
		Dnode* node = new Dnode;
		node->data = data;
		
		temp->next = node;
		node->prior = temp;
		temp = node;
		temp->next = nullptr;

		printf("请输入结点数据:");
		scanf_s("%d", &data);
	}

	return true;
}
bool initList(DlinkList& L) {
	L = new Dnode;
	if (L == nullptr) {
		printf("链表初始化错误!!!");
		return false;
	}
	
	L->next = nullptr;
	L->prior = nullptr;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值