#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;
}
c++双链表的各种操作(快慢指针,,双链表的创建,翻转双链表等)
最新推荐文章于 2022-07-20 14:10:03 发布