C++雙向輪回列表用法實例。本站提示廣大學習愛好者:(C++雙向輪回列表用法實例)文章只能為提供參考,不一定能成為您想要的結果。以下是C++雙向輪回列表用法實例正文
本文實例講述了C++雙向輪回列表用法。分享給年夜家供年夜家參考。詳細以下:
/*
雙向輪回鏈表
*/
#include <iostream>
using namespace std;
//構造體結構鏈表的指針域和數據域
struct ChainNode
{
int data; //節點數據
ChainNode *left; //節點的先驅指針
ChainNode *right; //節點的後繼指針
};
////////////創立n個雙向輪回鏈表 並前往鏈表頭指針/////////
ChainNode* CreateNode(int n)
{
ChainNode *head = NULL; //鏈表頭節點
ChainNode *pCur=NULL,*pNew=NULL; //以後節點,新建節點
//初始化頭結點的先驅和後繼節點都為NULL
if (n<1) //沒有節點 前往頭節點
{
return head;
}
//創立頭節點並將器閣下指針指向空
head = new ChainNode;
head->left = NULL;
head->right = NULL;
head->data = 0;
pCur = head;
//為避免指針互指帶來的凌亂,用pCur節點保留了頭節點 也表現以後指針挪動到了頭指針
//創立n個節點 並銜接成鏈表
for (int i=0; i<n; i++)
{
pNew = new ChainNode; //創立一個新節點
cout<<"請輸出數據:";
cin>>pNew->data;
pCur->right = pNew; //頭指針的右指針指向新建節點
pNew->left = pCur; //新建節點的左指針履行頭節點
pNew->right = NULL; //用於最初和頭指針停止交流
pCur = pNew; //指針往下挪動
}
//最初將頭指針的左指針指向最初一個節點,
//最初一個節點的有指針指向頭指針,組成輪回
head->left = pCur;
pCur->right = head;
return head;
}
//////////////輸入鏈表頭節點///////////////////////
void OutList(ChainNode *head) //參數為頭指針 從頭指針開端
{
cout<<"鏈表元素輸入以下:"<<endl;
ChainNode *pCur = head->right;
//重第一個節點開端輸入
//沒有指向空節點,則鏈表沒停止 輸入鏈表元素
while (pCur->right != head)
{
cout<<pCur->data<<" ";
pCur = pCur->right;
//以後節點指向下一個節點 可以遍歷鏈表
}
cout<<pCur->data<<endl;
//輸出最初一個元素,它的右指針履行head
}
///////在雙向輪回鏈表後添加n個節點//////
ChainNode* AddNode(ChainNode* head, int n)
{
ChainNode *pNew,*pCur;
//新添加節點和以後節點
pCur = head;
//挪動到最節點
while (pCur->right != head)
{
pCur = pCur->right;
//以後節點往下挪動 一向移到最初一個節點
}
//新添加n個節點並拔出鏈表
for (int i=0; i<n; i++)
{
pNew = new ChainNode;
cout<<"輸出要添加的節點元素:";
cin>>pNew->data;
pCur->right = pNew; //頭指針的右指針指向新建節點
pNew->left = pCur; //新建節點的左指針履行頭節點
pNew->right = NULL; //用於最初和頭指針停止交流
pCur = pNew; //指針往下挪動
}
//最初將頭指針的左指針指向最初一個節點,
//最初一個節點的有指針指向頭指針,組成輪回
head->left = pCur;
pCur->right = head;
return head;
}
/////在雙向輪回鏈表中刪除一個節點///////
ChainNode* DeleteNode(ChainNode* head, unsigned num)
//刪除第num個節點
{
ChainNode *pNew,*pCur,*temp;
//新添加節點和以後節點 ,暫時交流節點
pCur = head;
int ncount = 0;
//挪動到第num-1個節點
while (1)
{
ncount++;
pCur = pCur->right; //以後節點往下挪動
if (num == ncount)
{
break; //此時pCur照樣指向了第num個節點
}
}
//以後節點的前一個節點的右指針 指向 以後節點的下一個節點
//以後節點的下一個節點的左指針 指向 以後節點的上一個節點 組成銜接
//最初 刪除以後節點
(pCur->left)->right = pCur->right;
(pCur->right)->left = pCur->left;
delete pCur;
return head;
}
int main()
{
int num;
//創立num個節點並顯示
cout<<"輸出要創立的鏈表節點個數:";
cin>>num;
ChainNode *head = CreateNode(num);
OutList(head);
//往鏈表後添加n個節點
int addnum;
cout<<"輸出要添加的節點個數:";
cin>>addnum;
AddNode(head, addnum);
OutList(head);
//刪除鏈表的第del個元素
int del;
cout<<"輸出要刪除的第幾個地位的節點:";
cin>>del;
DeleteNode (head, del);
OutList(head);
system("pause");
return 0;
}
願望本文所述對年夜家的C++法式設計有所贊助。