您的位置:首页 > 编程语言 > C语言/C++

c++关于链表的操作

2014-11-15 10:33 232 查看
网上搜到的链表操作大都是c的,由于最近要准备一个c++的面试,遂写了一些c++链表的基本操作,不多说直接上代码。

#include <iostream>
using namespace std;

class MyNode
{
public:
MyNode();                                         //默认构造函数
MyNode *Create();                                 //创建链表
void CoutAll(MyNode *Head);                       //遍历输出链表
void SetValue(int value);                         //设置成员变量m_Value的值
int GetLength(MyNode *Head);                      //得到链表长度
void DeleteNode(MyNode **Head,int n);             //删除链表中第n个元素
void DeleteNode2(MyNode **Head,int n);            //删除链表中值为n的元素
void InsertNode(MyNode **Head,MyNode *value,int n);             //向链表中插入节点
void AddToTail(MyNode *Head,MyNode *value);                     //链表末尾添加节点
private:
int m_Value;
MyNode *pNext;
};

//默认构造函数
MyNode::MyNode()
{
m_Value=0;
pNext=NULL;
}

//创建链表
MyNode *MyNode::Create()
{
int value;
MyNode *pHead=NULL;
MyNode *pTail=NULL;
while(1)
{
cout<<"please input node"<<endl;
cin>>value;
if(value==-1)
{
break;
}
MyNode *node=new MyNode();
node->m_Value=value;
if(pHead!=NULL&&pTail!=NULL)
{
pTail->pNext=node;
pTail=node;
}
else
{
pHead=pTail=node;
}
}
return pHead;
}
//设置成员变量m_Value的值
void MyNode::SetValue(int value)
{
m_Value=value;
}

//遍历输出链表
void MyNode::CoutAll(MyNode *Head)
{
MyNode *index=Head;
if(index==NULL)
{
cout<<"链表中没有数据"<<endl;
}
while(index!=NULL)
{
cout<<index->m_Value<<endl;
index=index->pNext;
}
}

//得到链表长度
int MyNode::GetLength(MyNode *Head)
{
MyNode *index=Head;
int length=0;
while(index!=NULL)
{
++length;
index=index->pNext;
}
return length;
}

//删除链表中第n个元素
void MyNode::DeleteNode(MyNode **Head,int n)
{
MyNode *Temp=NULL;
int length=GetLength(*Head);
if(n>length||n<1)
{
cout<<"n值范围错误"<<endl;
}
int count=0;
if(n==1)
{
Temp=*Head;
*Head=(*Head)->pNext;
delete Temp;
Temp=NULL;
}
MyNode *index=*Head;
if(n>1&&n<=length)
{
while(index!=NULL)
{
++count;
if(count==(n-1))
{
Temp=index->pNext;
index->pNext=index->pNext->pNext;
delete Temp;
Temp=NULL;
}
index=index->pNext;
}
}
}

//删除链表中值为n的元素
void MyNode::DeleteNode2(MyNode **Head,int n)
{
MyNode *Temp=NULL;
while((*Head)!=NULL&&(*Head)->m_Value==n)
{
Temp=*Head;
*Head=(*Head)->pNext;
delete Temp;
Temp=NULL;
}
MyNode *index=*Head;
while(index!=NULL)
{
if(index->pNext==NULL)
{
break;
}
else if(index->pNext->m_Value==n)
{
Temp=index->pNext;
index->pNext=index->pNext->pNext;
delete Temp;
Temp=NULL;
}
else
{
index=index->pNext;
}
}
}

//向链表中插入节点
void MyNode::InsertNode(MyNode **Head,MyNode *value,int n)
{
int length=GetLength(*Head);
int count=0;
MyNode *index=*Head;
if(n<1||n>length)
{
cout<<"n取值范围错误"<<endl;
}
if(n==1)
{
value->pNext=(*Head);
(*Head)=value;
}
if(n>1&&n<=length)
{
while(index!=NULL)
{
++count;
if(count==(n-1))
{
value->pNext=index->pNext;
index->pNext=value;
break;
}
index=index->pNext;
}
}
}

void MyNode::AddToTail(MyNode *Head,MyNode *value)
{
MyNode *index=Head;
while(index->pNext!=NULL)
{
index=index->pNext;
}
index->pNext=value;
}

int main()
{
MyNode *Head=new MyNode();
Head=Head->Create();
Head->CoutAll(Head);
//	Head->DeleteNode(&Head,9);
MyNode *node=new MyNode();
node->SetValue(20);
//	Head->InsertNode(&Head,node,9);
Head->AddToTail(Head,node);
Head->CoutAll(Head);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: