c++链表及菜单设计
把对链表的操作以菜单形式表现出来,通过数字或字母的选择,进行链表操作的选择。菜单样式:
1 链表创建
2 节点插入
3 节点删除
4 退出程序
选择1-4
使用数字1-4来选择菜单项,其他输入不起作用
追问:很好,很感谢,但是总觉得跟我的题目不是很一样,题目中的菜单只是有四个选项啊
追问:很好,很感谢,但是总觉得跟我的题目不是很一样,题目中的菜单只是有四个选项啊
答案:/*哇!终于做好了,真是的,从7点做的,居然做到现在,呵呵~~,不过,都可以运行了,可以满足楼主您的要求了,代码如下:*/,#include<iostream.h>
typedef int datatype; //结点数据类型,假设为 int
typedef struct node * pointer; // 结点数据类型
struct node{
int number;
datatype data;
pointer next;
};
typedef pointer iklist; //单链表类型,即头指针类型//建表
iklist creat()
{
pointer head,rear,s;
int ch,num=1;
head=new node; //生成头结点
rear=head; //尾指针初值指向头结点
cout<<"请输入链表的数据(以输入0结束):\n";
while(cin>>ch,ch!=0){ // 读入结点值,并检测是否为结束符
s=new node; //生成新结点
s->data=ch;
s->number=num;
num++;
rear->next=s; //非空表,新结点 *s 插入到尾指针 *rear 之后
rear=s; //尾指针 rear 指向新的表尾;
}
rear->next=NULL; //尾结点的后继指针置空
return head; //返回单链表头指针
}//初始化
iklist initlist(){
pointer head;
head=new node;
head->next=NULL;
return head;
}//按序号查找
pointer find(iklist head,int i){
int j;
pointer p;
if(i<0) return NULL; //位置非法,无此结点
j=-1; //计数器
p=head; //从头结点考试搜索
while(p!=NULL && j<i){
j++;
p=p->next; //没有搜索到第 i 个结点,继续下一个结点
}
return p;
}//插入
int insert(iklist head,datatype x,int i){
pointer q,s;
q=find(head,i-1); //找到第 i-1 个结点位置
if(q==NULL) {cout<<"非法插入位置!\n";return 0;} //无第 i-1 个结点,即i<1 或 i>n+1时;
s=new node; //生成新结点
s->data=x;
s->next=q->next;
q->next=s;
return 1; //插入成功!
}//按序号删除
int deletei(iklist head,int i){
pointer p,q;
q=find(head,i=1); //找待删点的直接前趋
if(q==NULL || q->next==NULL) {cout<<"非法删除位置!\n";return 0;}//即i<1 或i>n
p=q->next; //保存待删点的地址,用于释放空间
q->next=p->next; //修改前趋的指针
delete p; //释放已删除的结点空间
return 1; //删除成功
}//表长
int length(iklist head){
int j=0; //计数器
pointer p;
p=head->next; //从首结点开始搜索
while(p!=NULL){
j++;
p=p->next;
}
return j;
}//定位
int locate(iklist head,datatype x){
int j;
pointer p;
j=0; //计数器
p=head->next; //指向首结点,从首结点开始扫描
while(p!=NULL){
j++;
if(p->data==x) break; //找到了x,退出循环
p=p->next; //没有找到,继续扫描下一个结点
}
if(p->data==x) return j; //找到了x
else return -1;
}//显示链表
void show(iklist head){
head=head->next;
for(int i=1;head!=NULL;i++){
cout<<"number: "<<i<<" data: "<<head->data<<endl;
head=head->next;
}
}
void main()
{
iklist L;
int ch,i,k;
datatype x;
L=initlist();
XX: do
{
cout<<" 主菜单\n"
<<" 1.尾插建表\n"
<<" 2.插入\n"
<<" 3.按序号删除\n"
<<" 4.退出程序\n"
<<" 5.求表长\n"
<<" 6.定位(按值查找)\n"
<<" 7.显示链表\n"
<<endl;
cin>>ch;
switch(ch)
{
case 1:
L=creat();
if(L!=NULL) cout<<"链表已建成!\n";
else cout<<"链表建立失败\n";
break;
case 2:
cout<<"输入插入位置号 \n";
cin>>i;
if(i<0 ||i>length(L))
{cout<<"插入位置非法!\n"; break;}
cout<<"还有插入位置 "<<i<<" 的数值:";
cin>>x;
k=insert(L,i,x);
if(k) cout<<"插入成功!\n";
else cout<<"插入失败!\n";
break;
case 3:
cout<<"输入删除位置号 \n";
cin>>i;
if(deletei(L,i)) cout<<"删除成功!\n";
else cout<<"删除失败!\n";
break;
case 4:
case 0:
delete(L); //退出程序时释放链表空间
break;
case 5:
cout<<"链表的长度是: "<<length(L)<<endl;
break;
case 6:
cout<<"请输入要查找的值: "<<endl;
cin>>x;
cout<<x<<" 在该链表的位置是(-1表示查找不到!): "<<locate(L,x)<<endl;
break;
case 7:
cout<<"显示链表:\n";
show(L);
break;
default:
cout<<"非法输入! 请重新输入... ....\n";
goto XX;
}
cout<<"-------------------------------------------------------";
} while(1);
}//希望对你有帮助,.^_^.
在调用插入函数insert()时在main()函数里,调用时的参数 datatye x,与 int i 的顺序排错了,
我们先看一下插入函数的原型:
//插入函数原型:
int insert(iklist head,datatype x,int i)注意一下它的函数定义:int insert(iklist head,datatype x,int i)
而在主函数main()里面,调用时,即,选择项case 2:里是:
k=insert(L,i,x);应该改为:k=insert(L,x,i) 才正确!
上一个:C++流和文件流
下一个:怎么用ECLIPSE写C++程序?