单链表(数据结构)
来源:互联网 发布:群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
阅读全文
0 0
- 数据结构(1)----单链表
- 【数据结构(C++)】单链表
- 数据结构 - 单链表(C++)
- 数据结构---单链表(1)
- 数据结构---单链表(2)
- 数据结构---单链表(3)
- 数据结构(14)单链表
- java数据结构(单链表)
- 数据结构----单链表(c++)
- 数据结构:单链表(四)
- 数据结构:单链表(逆序)
- 数据结构一(单链表)
- 单链表(数据结构)
- 数据结构(一)单链表
- 【数据结构】数据结构C语言的实现(单链表)
- 数据结构 - 反转单链表(C++)
- 数据结构之单链表(C++)
- C语言数据结构--(单链表)
- Windows 性能监视器概述
- 接口回调
- CPU负载过高
- iOS闪退问题,避免闪退看我就足够了, try catch等方法
- python编写一个用户登录程序
- 单链表(数据结构)
- Spring AOP实例(五大通知类型)
- 线程池
- FFmpeg编码详细流程
- BZOJ 2836: 魔法树 树链剖分+DFS序
- 边框距离上下都是有距离的
- 硬盘的读写原理
- Comparable和Comparator的区别和联系
- Android:实现装备购买