单链表(数据结构)

来源:互联网 发布:群p是种什么体验知乎 编辑:程序博客网 时间:2024/06/05 18:25

//利用c++编写的单链表,实现了基本的功能

#include <iostream>

using namespace std;
#if 1
//结点
class Node 
{
public:
Node():next(NULL){}
Node(int num,Node *p = NULL):value(num),next(p){}
int value;
Node *next;
};
//带头和尾结点的单链表
class List
{
public:
List():m_pHead(NULL),m_pTail(NULL){}
~List(){clear();}
void insertHead(int value);
void insertTail(int value);
void insertIvalue(int i,int value);
void print();
void deleteHead();
void deleteTail();
void deleteivalue(int i);
bool IsEmpty();
int length();
void clear();
Node *GetHead();
Node *Getip(int i);
void SetIvalue(int i,int num);
private:
Node *m_pHead;
Node *m_pTail;
};
//头插法
void List::insertHead(int value)
{
Node *p = new Node(value);
if(m_pHead == NULL)
{
m_pHead = m_pTail = p;
}
else
{
p->next = m_pHead;
m_pHead = p;
}
}
//尾插法
void List::insertTail(int value)
{
Node *p = new Node(value);
if(m_pHead == NULL)
{
m_pHead = m_pTail = p;
}
else
{
m_pTail ->next = p;
m_pTail = p;
}
}
//从第i个位置插入数据
void List::insertIvalue(int i,int value)
{
Node *p = new Node(value);
int k = 1;
Node *temp = m_pHead;
while(temp != NULL && k < i-1)
{
temp = temp ->next;
k++;
}
if(temp != NULL)
{
p->next = temp->next;
temp->next = p;
}
else
{
cout<<"value insert error\n";
}
}
//输出数据
void List::print()
{
Node *p = m_pHead;
cout<<"该链表为:";
while(p)
{
cout<<p->value<<" ";
p = p->next;
}
cout<<endl;
}
//删除尾部数据
void List::deleteTail()
{
if(IsEmpty())
return ;
else if(m_pHead->next == NULL)
{
delete m_pHead;
m_pHead = m_pTail = NULL;
}
else
{
Node *temp =Getip(length()-1)->next;
Getip(length()-1)->next = temp->next;
delete temp;
temp = NULL;
}
}
//删除头部数据
void List::deleteHead()
{
if(IsEmpty())
return;
else if(m_pHead->next == NULL)
{
delete m_pHead;
m_pHead = m_pTail = NULL;
}
else
{
Node *temp = m_pHead;
m_pHead = m_pHead->next;
delete temp;
temp = NULL;
}
}
//将第i个位置的数据删除
void List::deleteivalue(int i)
{
Node *del;
if(i < 0 || i > length())
cout<<"delete value error,please input true !"<<endl;
else if(i == 1)
deleteHead();
else
{
del = Getip(i-1)->next;
Getip(i-1)->next = del->next;
delete del;
del = NULL;
}
}
//是否为空链表
bool List::IsEmpty()
{
return m_pHead == NULL? true : false;
}
//获取链表的长度
int List::length()
{
int len = 0;
Node *p = m_pHead;
while(p)
{
len++;
p = p->next;
}
return len;
}
//清理链表中的数据
void List::clear()
{
while(m_pHead)
{
deleteHead();
}
}
//获得头指针
Node *List::GetHead()
{
return m_pHead;
}
//获取第i个结点
Node *List::Getip(int i)
{
if(i < 0 || i >length())
return NULL;
else
{
Node *p = m_pHead;
while(--i)
{
p = p->next;
}
return p;
}
}
//用num修改第i个元素的值
void List::SetIvalue(int i,int num)
{
if(i <= 0) return ;
Node *temp = Getip(i);
if(temp == NULL ) return ;
else
temp->value  = num;
}


//菜单
void menu()
{
   cout<<"**************************************"<<endl;
cout<<"[0] exit           [1] insertTail    *"<<endl;
cout<<"[2] insertIvalue   [3] insertHead    *"<<endl;
cout<<"[4] deleteHead     [5] deleteTail    *"<<endl;
cout<<"[6] deleteivalue   [7] length        *"<<endl;
cout<<"[8] clear          [9] GetHead       *"<<endl;
cout<<"[10]Getip          [11] SetIvalue    *"<<endl;
cout<<"**************************************"<<endl;
}
int main()
{
List mylist;
int select = 1;
while(select)
{
menu();
cout<<"pleace input num>";
cin>>select;
switch(select)
{
case 1:
{
int value;
cout<<"pleace input insertail value>";
cin>>value;
mylist.insertTail(value);
mylist.print();
cout<<"insertail OK!"<<endl;
}
break;
case 2:
{
int value,i;
cout<<"pleace input insertIvalue i and value>";
cin>>i>>value;
mylist.insertIvalue(i,value);
mylist.print();
cout<<"insertIvalue OK!"<<endl;
}
break;
case 3:
{
int value;
cout<<"pleace input inserhead value>";
cin>>value;
mylist.insertHead(value);
mylist.print();
cout<<"inserhead OK!"<<endl;
}
break;
case 4:
{
mylist.deleteHead();
mylist.print();
cout<<"deleteHead OK!"<<endl;
}
break;
case 5:
{
mylist.deleteTail();
mylist.print();
cout<<"deleteTail OK!"<<endl;
}
break;
case 6:
{
int i;
cout<<"pleace input deletevalue i >";
cin>>i;
mylist.deleteivalue(i);
mylist.print();
cout<<"deletevalue OK!"<<endl;
}
break;
case 7:
{
cout<<"该链表的长度为:"<<mylist.length()<<endl;
mylist.print();
}
break;
case 8:
{
cout<<"清除该链表"<<endl;
mylist.clear();
cout<<"输出数据为"<<endl;
mylist.print();
}
break;
case 9:
{
cout<<"该链表的头指针为"<<mylist.GetHead()->value<<endl;
mylist.print();
}
break;
case 10:
{
int i;
cout<<"pleace input  i >";
cin>>i;
cout<<"该链表第"<<i<<"位置的数据为"<<mylist.Getip(i)->value<<endl;
}
break;
case 11:
{
int value,i;
cout<<"pleace input  i and value>";
cin>>i>>value;
mylist.SetIvalue(i,value);
mylist.print();
cout<<"insertIvalue OK!"<<endl;
}
break;
case 0:
break;
}
system("PAUSE");
system("CLS");
}
return 0;
}
#endif
原创粉丝点击