数据结构--单链表基本功能实现程序…
2015-01-01 21:00
579 查看
#include
#include
#include
const
MAXNUMOFBASE=5;
//基础数据总量
enum
returninfo{success,fail,overflow,underflow,range_error};//定义返回信息清单
int
sourcedata[MAXNUMOFBASE]={11,22,33,55,66,};
//内部数据数组,节省每次建立时输入时间
class
node
{
public:
int
data; //数据域
node
*next; //结点指针
};
class
linklist
{
private:
node *headp;
protected:
int
count;
//计数器
统计结点个数即线性表的长度
public:
linklist();
//构造函数
~linklist();
//析构函数
returninfo
create(void);
//链表的初始化
void
clearlist(void);
//清空链表
bool empty(void)
const;
//判断是否空链
int size(void)
const;
//求链表的长度
returninfo
traverse(void);
//遍历链表所有元素
returninfo retrieve(int position,int &item) const;
//读取一个结点
returninfo replace(int position,const int
&item);
//修改一个结点
returninfo insert(int position,const int
&item);
//插入一个结点
returninfo remove(int
position);
//删除一个结点
returninfo
invertlist(void);
//链表所有数据反转
};
linklist::linklist()
//构造函数
{
headp=new
node;
//申请新结点,作为头结点
headp->next=NULL;
//头结点的地址域预设为空地址
count=0;
//计数器清零,表明开始时没有实际数据
}
linklist::~linklist()
//析构函数
{
clearlist();
//删除所有数据,释放所有结点
delete
headp;
//把头结点也释放掉
count=0;
//计数器清零,表明开始时没有实际数据
}
returninfo
linklist::create(void)
{
node *searchp=headp,*newnodep;
int i;
for (i=0;i
{
newnodep=new node;//此处对于申请失败并没有处理
newnodep->data=sourcedata[i];
newnodep->next=NULL;
searchp->next=newnodep;
searchp=searchp->next;
count ;
}
searchp->next=NULL;
traverse();
return success;
}
void
linklist::clearlist(void)
//清空链表
{
node
*searchp=headp->next,*followp=headp;
//初始化两个指针
while(searchp!=NULL)
{
followp=searchp;
searchp=searchp->next;
delete followp;
}
headp->next=NULL;
//保留了最后一个结点,就是头结点,并且链域置为空
count=0;
//计数器也清零
}
bool
linklist::empty(void)const
//是否空链
{
if(headp->next==NULL)
return true;
else
return false;
}
int
linklist::size(void)const
//求链表的长度
{
return
count;
}
returninfo
linklist::traverse(void)
//遍历链表中的所有元素
{
node
*searchp;
//启用搜索指针
if(empty())
return
underflow;
//空表的处理
searchp=headp->next;
cout<<"链表中的全部数据为:
Headp-->";
//提示显示数据开始
while(searchp!=NULL)
//循环显示所有数据
{
cout<<"
"<<searchp->data;
if (searchp->next==NULL)
cout<<"
-->endl";
else
cout<<"
-->";
searchp=searchp->next;
}
cout<<endl;
//最后有一个回车的控制
return
success;
//本次操作成功
}
returninfo
linklist::retrieve(int position, int &item)
const //读取一个结点
{
if(empty())
//处理意外
return
underflow;
if(position<=0||position>=count
1)
//处理意外
return range_error;
node
*searchp=headp->next;
//定义搜索指针,初始化
for(int i=1; i
//提示:注意小于号
searchp=searchp->next;
//顺序访问方式,用循环,算法复杂度是O(n)
item=searchp->data;
//返回读取的数据
return
success;
//本次操作成功
}
returninfo
linklist::replace(int position,const int
&item)
//修改一个结点
{
if(empty())
return
underflow;
if(position<=0||position>=count
1)
return range_error;
node *searchp=headp->next;
for(int i=1; i
searchp=searchp->next;
searchp->data=item;
//实际修改数据的语句
return success;
}
returninfo
linklist::insert(int position,const int
&item)
//插入一个结点
{
if(position<=0 || position>=count
2)
return range_error;
node *newnodep=new node,
*searchp=headp->next,
*followp=headp;
for(int i=1; i
{
followp=searchp;
searchp=searchp->next;
}
newnodep->data=item;
//给数据赋值
newnodep->next=followp->next;
//注意此处的次序相关性
followp->next=newnodep;
count
;
//计数器加一
return success;
}
returninfo
linklist::remove(int
position)
//删除一个结点
{
if(empty())
return
underflow;
if(position<=0||position>=count
1)
return range_error;
node
*searchp=headp->next,*followp=headp;
//这里两个指针的初始值设计一前一后
for(int i=1; i
{
followp=searchp;
searchp=searchp->next;
}
followp->next=searchp->next;
//删除结点的实际语句
delete
searchp;
//释放该结点
count--;
//计数器减一
return success;
}
returninfo
linklist::invertlist(void)
{
node
*nowp,*midp,*lastp;
//启用多个辅助指针
if(empty())
return underflow;
nowp=headp->next;
midp=NULL;
while(nowp!=NULL)
{
lastp=midp;
midp=nowp;
nowp=nowp->next;
midp->next=lastp;
}
headp->next=midp;
return success;
}
class
interfacebase
{
private:
linklist listonface;
public:
void clearscreen(void);
void showmenu(void);
int userchoice(void);
returninfo processmenu(int menuchoice);
};
void
interfacebase::clearscreen(void)
{
system("cls");
}
void
interfacebase::showmenu(void)
{
cout<<"链表基本功能菜单"<<endl;
cout<<"=========="<<endl;
cout<<"1.输入数据(内部用数组提供5个数据)"<<endl;
cout<<"2.显示数据(遍历全部数据)"<<endl;
cout<<"3.修改数据(要提供位置和新值)"<<endl;
cout<<"4.插入数据(要提供位置和新值)"<<endl;
cout<<"5.删除数据(要提供位置)"<<endl;
cout<<"6.读取数据(要提供位置)"<<endl;
cout<<"7.求表长度"<<endl;
cout<<"8.数据反转(全部数据逆序存储)"<<endl;
cout<<"9.结束程序"<<endl;
cout<<"=========="<<endl;
}
int
interfacebase::userchoice(void)
{
int menuchoice;
cout<<"请输入您的选择:";
cin>>menuchoice;
return menuchoice;
}
returninfo
interfacebase::processmenu(int menuchoice)
{
int position,item,returnvalue;
switch(menuchoice)
//根据用户的选择进行相应的操作
{
case 1:
returnvalue=listonface.create();
if(returnvalue==success)
cout<<"建立链表操作成功!请按任意键继续..."<<endl;
break;
case 2:
returnvalue=listonface.traverse();
if(returnvalue==underflow)
cout<<"链表目前为空,没有数据可以显示!请按任意键继续..."<<endl;
else
cout<<"链表遍历操作成功!请按任意键继续..."<<endl;
break;
case 3:
cout<<"请输入要修改数据的位置:";
cin>>position;
cout<<"请输入要修改的新数据:";
cin>>item;
returnvalue=listonface.replace(position,item);
if(returnvalue==underflow)
cout<<"对不起,链表已空!请按任意键继续..."<<endl;
else if(returnvalue==range_error)
cout<<"对不起,修改的位置超出了范围!请按任意键继续..."<<endl;
else
cout<<"修改操作成功!请按任意键继续..."<<endl;
break;
case 4:
cout<<"请输入要插入数据的位置:";
cin>>position;
cout<<"请输入要插入的新数据:";
cin>>item;
returnvalue=listonface.insert(position,item);
if(returnvalue==range_error)
cout<<"对不起,插入的位置超出了范围!请按任意键继续..."<<endl;
else
cout<<"插入操作成功!请按任意键继续..."<<endl;
break;
case 5:
cout<<"请输入要删除数据的位置:";
cin>>position;
returnvalue=listonface.remove(position);
if(returnvalue==underflow)
cout<<"对不起,链表已空!请按任意键继续..."<<endl;
else if(returnvalue==range_error)
cout<<"对不起,删除的位置超出了范围!请按任意键继续..."<<endl;
else
cout<<"删除操作成功!请按任意键继续..."<<endl;
break;
case 6:
cout<<"请输入要读取数据的位置:";
cin>>position;
returnvalue=listonface.retrieve(position,item);
if(returnvalue==underflow)
cout<<"对不起,链表已空!请按任意键继续..."<<endl;
else if(returnvalue==range_error)
cout<<"对不起,读取的位置超出了范围!请按任意键继续..."<<endl;
else
cout<<"读取的数据为:"<<item<<endl<<"读取操作成功!请按任意键继续..."<<endl;
break;
case 7:
cout<<"链表目前的长度为:
"<<listonface.size()<<endl;
cout<<"求链表长度操作成功!请按任意键继续..."<<endl;
break;
case 8:
returnvalue=listonface.invertlist();
if(returnvalue==underflow)
cout<<"对不起,链表已空!请按任意键继续..."<<endl;
else
cout<<"链表所有元素反转操作成功!请按任意键继续..."<<endl;
break;
case
9:
exit(0);
default:
cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;
break;
}
return success;
}
void
main(void)
//程序主入口
{
int
menuchoice;
//下面要用到
interfacebase interfacenow;
linklist linklistnow;
interfacenow.clearscreen();
while (1)
{
interfacenow.showmenu();
menuchoice=interfacenow.userchoice();
interfacenow.processmenu(menuchoice);
getch();
Sleep(200);
//延迟了一会
interfacenow.clearscreen();
}
}//主函数结束
相关文章推荐
- 数据结构--链队基本功能实现程序代…
- 数据结构--顺序表基本功能实现程序…
- 数据结构--链栈基本功能实现程序代…
- 用C实现基本链表功能
- C++类模板 实现双向循环链表的基本算法 《数据结构》(C++版 北京科海)中摘抄
- 数据结构--基本查找方法实现程序代…
- 【C++数据结构】模版类实现双循环链表的基本操作
- 数据结构之栈的基本功能实现
- 单链表的基本功能 与扩展功能的实现
- 【数据结构和算法分析】单链表的基本实现
- 数据结构学习之单向链表的基本操作(非递归实现)
- [C++]数据结构:有序链表SortedChain的基本实现与操作
- 我自己编的一个c语言小程序:银行基本功能的实现
- 关于用栈链表来实现中序表达式的一个小程序 《数据结构》
- 链表基本操作的程序实现(转2)
- 链表的建立和一些基本功能的实现
- C/C++基本数据结构:链表的基本使用和实现
- 【C++/STL】list的实现(没有采用迭代器和空间配置器所实现的双向链表的基本功能)
- 数据结构与算法学习 第1季02 链表的基本功能 C++实现