關(guān)于雙向鏈表的增刪改查和排序的C++實現(xiàn)
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結(jié)點中都有兩個指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個結(jié)點開始,都可以很方便地訪問它的前驅(qū)結(jié)點和后繼結(jié)點。一般我們都構(gòu)造雙向循環(huán)鏈表。
由于雙向鏈表可以方便地實現(xiàn)正序和逆序兩個方向的插入、查找等功能,在很多算法中經(jīng)常被使用,
這里用C++構(gòu)造了一個雙向鏈表,提供了對雙向鏈表的插入、查找、刪除節(jié)點、排序等功能,其中排序提供了插入排序和冒泡排序兩種方式
#include<iostream>
using namespace std;
class Node //組成雙向鏈表的節(jié)點
{
public:
int data;
Node * pNext;
Node * pLast;
};
class List //構(gòu)造一個雙向鏈表
{
private:
Node * pHead;
Node * pTail;
int length;
public:
List(int length) //創(chuàng)建雙向鏈表
{
this->length=length;
pHead=new Node();
pHead->pLast=NULL;
pTail=pHead;
for(int i=0;i<length;i++)
{
Node * temp=new Node();
cout<<"please enter the no"<<i+1<<" Node's data:";
cin>>temp->data;
temp->pNext=NULL;
temp->pLast=pTail;
pTail->pNext=temp;
pTail=temp;
}
}
void traverseList() //正向遍歷
{
Node * p=pHead->pNext;
while(p!=NULL)
{
cout<<p->data<<endl;
p=p->pNext;
}
}
void traverseListReturn() //逆向遍歷
{
Node * p=pTail;
while(p->pLast!=NULL)
{
cout<<p->data<<endl;
p=p->pLast;
}
}
void sortList() //冒泡排序
{
Node * p=new Node();
Node * q=new Node();
int temp;
for(p=pHead->pNext;p->pNext!=NULL;p=p->pNext)
{
for(q=p->pNext;q!=NULL;q=q->pNext)
{
if(q->data<p->data)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
}
void sortListByInsertWay() //插入排序
{
if(pHead->pNext==NULL||pHead->pNext->pNext==NULL)
{
return;
}
Node * p2=pHead->pNext->pNext;
Node * p1=pHead;
pHead->pNext->pNext=NULL;
while(p2)
{
Node * pN=p2->pNext;
while(p1->pNext)
{
if(p2->data<p1->pNext->data)
{
p2->pNext=p1->pNext;
p2->pLast=p1;
p1->pNext->pLast=p2;
p1->pNext=p2;
break;
}
p1=p1->pNext;
}
if(p1->pNext==NULL)
{
p2->pNext=NULL;
p2->pLast=p1;
p1->pNext=p2;
}
p2=pN;
}
//重新查找pTail的位置
Node * pt=pHead;
while(pt->pNext)
{
pt=pt->pNext;
}
pTail=pt;
}
void changeList(int num,int position) //修改鏈表中指定位置的節(jié)點
{
Node * p=pHead->pNext;
if(position>length||position<=0)
{
cout<<"over stack !"<<endl;
return;
}
for(int i=0;i<position-1;i++)
{
p=p->pNext;
}
p->data=num;
}
void insertList(int num,int position) //插入數(shù)據(jù)
{
Node * p=pHead->pNext;
if(position>length||position<=0)
{
cout<<"over stack !"<<endl;
return;
}
for(int i=0;i<position-1;i++)
{
p=p->pNext;
}
Node * temp=new Node();
temp->data=num;
temp->pNext=p;
temp->pLast=p->pLast;
p->pLast->pNext=temp;
p->pLast=temp;
length++;
}
void clearList() //清空
{
Node * q;
Node * p=pHead->pNext;
while(p!=NULL)
{
q=p;
p=p->pNext;
delete q;
}
p=NULL;
q=NULL;
}
void deleteList(int position) //刪除指定位置的節(jié)點
{
Node * p=pHead->pNext;
if(position>length||position<=0)
{
cout<<"over stack !"<<endl;
return;
}
for(int i=0;i<position-1;i++)
{
p=p->pNext;
}
p->pLast->pNext=p->pNext;
p->pNext->pLast=p->pLast;
delete p;
length--;
}
int getItemInList(int position) //查找指定位置的節(jié)點
{
Node * p=pHead->pNext;
if(position>length||position<=0)
{
cout<<"over stack !"<<endl;
return 0;
}
for(int i=0;i<position-1;i++)
{
p=p->pNext;
}
return p->data;
}
~List()
{
Node * q;
Node * p=pHead->pNext;
while(p!=NULL)
{
q=p;
p=p->pNext;
delete q;
}
p=NULL;
q=NULL;
}
};
int main()
{
List l(3);
l.traverseList();
cout<<"AFTER SORT------------------------------------------------------"<<endl;
// l.sortList(); //冒泡排序
l.sortListByInsertWay(); //插入排序
l.traverseList();
cout<<"AFTER INSERT-----------------------------------------------------"<<endl;
l.insertList(55,1);
l.traverseList();
cout<<"AFTER DELETE-----------------------------------------------------"<<endl;
l.deleteList(1);
l.traverseList();
cout<<"Return Traverse---------------------------------------------"<<endl;
l.traverseListReturn();
cout<<"Find the Second Node's data:"<<l.getItemInList(2)<<endl;
return 0;
}
以上這篇關(guān)于雙向鏈表的增刪改查和排序的C++實現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持我們。
上一篇:詳解C++ 拷貝構(gòu)造函數(shù)和賦值運算符
欄 目:C語言
本文標題:關(guān)于雙向鏈表的增刪改查和排序的C++實現(xiàn)
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1950.html
您可能感興趣的文章
- 01-10深入理解鏈表的各類操作詳解
- 01-10用C語言實現(xiàn)單鏈表的各種操作(一)
- 01-10用C語言實現(xiàn)單鏈表的各種操作(二)
- 01-10深入單鏈表的快速排序詳解
- 01-10探討:將兩個鏈表非降序合并為一個鏈表并依然有序的實現(xiàn)方法
- 01-10C++ 構(gòu)造雙向鏈表的實現(xiàn)代碼
- 01-10用C++實現(xiàn)單向循環(huán)鏈表的解決方法
- 01-10如何用C++實現(xiàn)雙向循環(huán)鏈表
- 01-10C++ 模版雙向鏈表的實現(xiàn)詳解
- 01-10關(guān)于C語言函數(shù)strstr()的分析以及實現(xiàn)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子


