#include<iostream>
using namespace std;
class ListNode{
private:
int data;
ListNode *link;
public:
ListNode(int newdata)
{
data=newdata;
link=NULL;
}
int getData()
{
return data;
}
void setData(int newdata)
{
this->data=data;
}
void setLinkNode(ListNode *newlink)
{
link=newlink;
}
ListNode *getNode()
{
return link;
}
};
class List{
private:
ListNode *first,*check,*last;
int NodeNumbers;
public:
List()
{
first=NULL;
check=first;
last=first;
NodeNumbers=0;
}
List(int newdata)
{
first=new ListNode(newdata);
last = first;
check = first;
NodeNumbers = 1;
}
void addNode(int data)
{
if(this->first!=NULL)
{
ListNode *link=new ListNode(data);
(*last).setLinkNode(link);
last=link;
}
else
{
first=new ListNode(data);
last=first;
check=first;
}
NodeNumbers++;
}
void addNodeFirst(int data)
{
ListNode *link=new ListNode(data);
(*link).setLinkNode(first);
first=link;
check=first;
NodeNumbers++;
}
void setFirst(ListNode *first)
{
this->first=first;
}
void setLast(ListNode *last)
{
this->last=last;
}
ListNode* getFirst()
{
return first;
}
ListNode* getLast()
{
return last;
}
int getMin()
{
int minNumber=(*first).getData();
ListNode* link=first;
while(!link==NULL)
{
if((*link).getData()<minNumber)
{
minNumber=(*link).getData();
}
link=(*link).getNode();
}
return minNumber;
}
bool contain(int value)
{
ListNode* link=first;
while(!link==NULL)
{
if((*link).getData()==value)
{
return true;
}
link=(*link).getNode();
}
return false;
}
bool containRecursively(int value)
{
ListNode* link=check;
if(!link==NULL)
{
if((*link).getData()==value)
{
check=first;
return true;
}
else
{
check=(*check).getNode();
return this->containRecursively(value);
}
}
check=first;
return false;
}
List reverse()
{
List newList;
ListNode *link=first;
while(!link==NULL)
{
newList.addNodeFirst((*link).getData());
link=(*link).getNode();
}
return newList;
}
void coutList()
{
if(!first==NULL)
{
ListNode *link=first;
cout<<"链表元素是:"<<endl;
while(!link==NULL)
{
cout<<(*link).getData()<<" ";
link=(*link).getNode();
}
cout<<endl;
}
else
{
cout<<"链表为空"<<endl;
}
}
int Length()
{
return this->NodeNumbers;
}
};
int main()
{
List list;
while(true)
{
cout<<"***************************************"<<endl;
cout<<"0. 自动初始化链表"<<endl;
cout<<"1. 手动初始化链表"<<endl;
cout<<"2. 打印链表长度"<<endl;
cout<<"3. 打印链表最小元素"<<endl;
cout<<"4. 打印链表元素"<<endl;
cout<<"5. 打印倒序链表元素"<<endl;
cout<<"6. 查找链表元素(非递归)"<<endl;
cout<<"7. 查找链表元素(递归)"<<endl;
cout<<"8. 退出按其他数字键"<<endl;
cout<<"***************************************"<<endl;
cout<<"请选择菜单:";
int choice = 0;
cin>>choice;
switch(choice)
{
case 0:
{
cout<<"请输入链表的长度"<<endl;
int number=0;
cin>>number;
for(int i=0;i<number;i++)
{
list.addNode(i+1);
}
list.coutList();
break;
}
case 1:
{
char level = 'N';
while(level=='N'||level=='n')
{
int number = 0;
cout<<"请输入存入链表的数据(int型):";
cin>>number;
list.addNode(number);
cout<<"结束(N/Y):";
cin>>level;
}
system("cls");
list.coutList();
break;
}
case 2:
{
cout<<"链表长度为:"<<list.Length()<<endl;
break;
}
case 3:
{
cout<<"最小元素为:"<<list.getMin()<<endl;
break;
}
case 4:
{
list.coutList();
break;
}
case 5:
{
cout<<"倒序链表";
list.reverse().coutList();
break;
}
case 6:
{
int number = 0;
cout<<"请输入要查找的元素:";
cin>>number;
if(list.contain(number)==0)
{
cout<<"不存在元素"<<number<<endl;
}
else
{
cout<<"存在元素"<<number<<endl;
}
break;
}
case 7:
{
int number = 0;
cout<<"请输入要查找的元素:";
cin>>number;
if(list.containRecursively(number)==0)
{
cout<<"不存在元素"<<number<<endl;
}
else
{
cout<<"存在元素"<<number<<endl;
}
break;
}
default:
{
cout<<"您选择了退出程序..."<<endl;
break;
}
}
}
return 0;
}