#ifndef list_H
#define list_H
#include"List_Node.h"
template<class T>
class list:public listnode<T>
{
private:
listnode<T>* head;
listnode<T>* tail;
listnode<T>* current;
static int size;
public:
list(T b,listnode<T>* ptrnext):listnode<T>(b,ptrnext)
{
head=tail=current=0;
}
~list();
bool insertnode(T num1,int);
bool deletenode(T num2);
int searchnode(T num3);
void showlist();
int getsize();
int menu1();
};
template <class T>
int list<T>::size=0;
#endif
#ifndef List_Node_H
#define List_Node_H
template <class T>
class listnode
{
private:
T value;
listnode<T>* next;
public:
listnode(T a=0,listnode<T>* ptrnext=0)
{
value=a;
next=ptrnext;
}
~listnode()
{}
T getnode()
{
return value;
}
listnode<T>* getnext()
{
return next;
}
void setnext(listnode<T>* &othernode)
{
next=othernode;
}
};
#endif
#ifndef listmean_H
#define listmean_H
#include"list.h"
#include<iostream>
#include<cstdlib>
#include<assert.h>
using namespace std;
template<class T>
list<T>::~list()
{
listnode<T>* ptr=0;
current=head;
while(current)
{
ptr=current;
current=getnext();
delete ptr;
}
}
template<class T>
bool list<T>::insertnode(T num1,int position)
{
if(position==0)
{
listnode<T>* newptr=new listnode<T>(num1,head);
assert(newptr);
head=newptr;
size++;
return true;
}
else
{
if(position==1)
{
if(head)
{
listnode<T>* special=new listnode<T>(num1,head);
head=special;
size++;
return true;
}
else
return false;
}
else
{
if(position>1&&position<=size)
{
int i=1;
listnode<T>* p1;
listnode<T>* p2;
p1=head;
p2=p1->getnext();
while(p2&&i<position-1)
{
p1=p2;
p2=p2->getnext();
i++;
}
listnode<T>* newptr2=new listnode<T>(num1);
assert(newptr2);
p1->setnext(newptr2);
newptr2->setnext(p2);
size++;
return true;
}
else
return false;
}
}
}
template<class T>
int list<T>::searchnode(T num3)
{
int i=1;
current=head;
while(current&¤t->getnode()!=num3)
{
current=current->getnext();
i++;
}
if(!current)
return 0;
else
return i;
}
template<class T>
bool list<T>::deletenode(T num2)
{
int i=searchnode(num2);
if(i)
{
listnode<T>* oldptr=head;
current=head->getnext();
if(i==1)
{
oldptr=head->getnext();
delete head;
head=oldptr;
size--;
return true;
}
else
{
int j=1;
while(j<i)
{
oldptr=current;
current=current->getnext();
}
oldptr=current->getnext();
delete current;
size--;
return true;
}
}
else
return false;
}
template<class T>
void list<T>::showlist()
{
current=head;
while(current)
{
cout<<" "<<current->getnode();
current=current->getnext();
}
cout<<endl;
}
template<class T>
int list<T>::getsize()
{
return size;
}
template<class T>
int list<T>::menu1()
{
cout<<endl<<"================线性表的基本操作==================";
cout<<endl<<"1.向表中增加一个数据结点";
cout<<endl<<"2.删除表中的一个数据结点";
cout<<endl<<"3.查询表中的元素";
cout<<endl<<"4.显示表中的所有元素.";
cout<<endl<<"5.显示表中所有元素的数目.";
cout<<endl<<"6.退出操作.";
cout<<endl<<"==================================================";
cout<<endl<<"请选择你的操作:";
int choice;
cin>>choice;
while(choice>6||choice<1)
{
cout<<endl<<"你的输入操作有误,请重新输入:";
cin>>choice;
}
return choice;
}
#endif
#include<iostream>
#include<string>
#include"listmean.h"
using namespace std;
int main()
{
int choice2=0,num=0,position=0;
int flag=0;
list<int> L(0,0);
while(1)
{
choice2=L.menu1();
switch(choice2)
{
case 1:
cout<<endl<<"请输入要加入的数据和它要加入的位置:";
cin>>num>>position;
flag=L.insertnode(num,position);
if(flag)
cout<<endl<<"成功地加入了数据";
else
cout<<endl<<"你输入的位置有误,不能够将数据正确的加入到表中.";
break;
case 2:
cout<<endl<<"请输入你要删除的数据:";
cin>>num;
flag=L.deletenode(num);
if(flag)
cout<<endl<<"你已经成功的删除了该数据.";
else
cout<<endl<<"表中不存在这个数据.";
break;
case 3:
cout<<endl<<"请输入你要查找的这个数据:";
cin>>num;
flag=L.searchnode(num);
if(flag)
cout<<endl<<"你要查找的数据是表中第"<<flag<<"个数据.";
else
cout<<endl<<"不存在你要查找的数据.";
break;
case 4:
cout<<endl<<"表中的所有数据为:";
L.showlist();
break;
case 5:
flag=L.getsize();
cout<<endl<<"表中有"<<flag<<"个数据.";
break;
case 6:
exit(0);
}
}
return 0;
}
评论