在线等,c++简单问题。。。。急!
#include <iostream>
using namespace std;
class book
{
public:
int num;
float price;
book *next;
};
book*head=NULL;
//为什么要声明这个全局变量?
bool check(string str)
//检查用户输出是否为字符
{
for(int i=0;i<str.length();i++)
{
if((str[i]>'9' || str[i]<'0') && (str[i]!='.'))
return false;
}
return true;
}
book *creat()
//返回book类的指针
{
book *p1,*p2;
p1=new book;
head=p1;
p2=p1;
cout<<"请输出图书的编号,以0结束"<<endl;
string str;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->num=atoi(str.c_str());
//str调用类成员函数c_str把输入的string字符串转化成字
符数组型,再由atoi转化成整数型。
//c_str()成员函数返
回的是*char类型的临时指针,要把返回值赋给某变量名应该用strcpy函数
if(p1->num!=0)
{
cout<<"请输入图书的价格"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->price=atof(str.c_str());
//atof会把字符串转化成浮点型数值
}
else
{
delete p1;
p1=NULL;
head=NULL;
return head;
}
while(p1->num!=0)
{
p2=p1;
p1=new book;
cout<<"请输出图书的编号,以0结束"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->num=atoi(str.c_str());
if(p1->num!=0)
{
cout<<"请输入图书的价格"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->price=atof(str.c_str());
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}
void showbook(book *head)
{
cout<<endl;
cout<<"图书信息如下:"<<endl;
while(head)
{
cout<<"图书编号:"<<head->num<<"价格:"<<head->price<<endl;
head=head->next;
}
}
void Delete(book *head,int num)
{
book *l;
if(head->num==num)
{
l=head;
head=head->next;
::head=head;
//赋给全局的head;
delete l;
cout<<"操作成功"<<endl;
return;
}
while(head)
{
if(head->next==NULL)
{
cout<<"找不到要删除的编号."<<endl;
return;
}
if(head->next->num==num)
{
l=head->next;
head->next=l->next;
delete l;
cout<<"操作成功"<<endl;
return;
}
head=head->next;
}
cout<<"找不到要删除的编号."<<endl;
}
int main()
{
book *head;
head=creat();
showbook(head);
showbook(head);
cout<<"请输入你要删除的图书编号"<<endl;
int booknum;
cin>>booknum;
Delete(head,booknum);
showbook(head);
return 0;
}
--------------------------------------------分割线------------------------------------
删除编号为1的结点后,再调用showbook函数程序输入一个错误编号和价格,程序崩溃。
答案:问题出在Delete时的head传递上,修改如下:
class book
{
public:
int num;
float price;
book *next;
};
book*head=NULL;
//为什么要声明这个全局变量?
bool check(string str)
//检查用户输出是否为字符
{
for(int i=0;i<str.length();i++)
{
if((str[i]>'9' || str[i]<'0') && (str[i]!='.'))
return false;
}
return true;
}
book *creat()
//返回book类的指针
{
book *p1,*p2;
p1=new book;
head=p1;
p2=p1;
cout<<"请输出图书的编号,以0结束"<<endl;
string str;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->num=atoi(str.c_str());
//str调用类成员函数c_str把输入的string字符串转化成字
//符数组型,再由atoi转化成整数型。
// //c_str()成员函数返
// 回的是*char类型的临时指针,要把返回值赋给某变量名应该用strcpy函数
if(p1->num!=0)
{
cout<<"请输入图书的价格"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->price=atof(str.c_str());
//atof会把字符串转化成浮点型数值
}
else
{
delete p1;
p1=NULL;
head=NULL;
return head;
}
while(p1->num!=0)
{
p2=p1;
p1=new book;
cout<<"请输出图书的编号,以0结束"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->num=atoi(str.c_str());
if(p1->num!=0)
{
cout<<"请输入图书的价格"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->price=atof(str.c_str());
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}
void showbook(book *head)
{
cout<<endl;
cout<<"图书信息如下:"<<endl;
while(head)
{
cout<<"图书编号:"<<head->num<<"价格:"<<head->price<<endl;
head=head->next;
}
}
book *Delete(book *head,int num)
{
book *l;
if(head->num==num)
{
l=head;
head=head->next;
//::head=head;
//赋给全局的head;
delete l;
cout<<"操作成功"<<endl;
return head;
}
while(head)
{
if(head->next==NULL)
{
cout<<"找不到要删除的编号."<<endl;
return head;
}
if(head->next->num==num)
{
l=head->next;
head->next=l->next;
delete l;
cout<<"操作成功"<<endl;
return head;
}
head=head->next;
}
cout<<"找不到要删除的编号."<<endl;
return head;
}
int main()
{
book *head;
head=creat();
showbook(head);
showbook(head);
cout<<"请输入你要删除的图书编号"<<endl;
int booknum;
cin>>booknum;
head=Delete(head,booknum);
showbook(head);
return 0;
}
函数内部会形成一个head的副本,就是说你给进来参数*head,但实际上函数内部的所有操作实际是对head的副本"head"(它不是真正的head,只是二者指向同一个位置)进行操作的。如果改变"head"的指向,原始的head并不会被改变,只是副本的head被指向另外的位置。
另外new的内存,一定要delete,子函数结束不会自己释放的把最后的删了
上一个:为什么要说c++是静态语言
下一个:Sales_item.h(C++ primer 4)