当前位置:编程学习 > C/C++ >>

在线等,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&lt;str.length();i++)
{
if((str[i]&gt;'9' || str[i]&lt;'0') && (str[i]!='.'))
return false;
}
return true;
}

book *creat()
//返回book类的指针
{
book *p1,*p2;
p1=new book;
head=p1;
p2=p1;
cout&lt;&lt;"请输出图书的编号,以0结束"&lt;&lt;endl;
string str;
cin&gt;&gt;str;
while(!check(str))
{
cout&lt;&lt;"输入的不是数字,请重新输入,按0返回!!";
cin&gt;&gt;str;
}
p1-&gt;num=atoi(str.c_str());
//str调用类成员函数c_str把输入的string字符串转化成字

//符数组型,再由atoi转化成整数型。
// //c_str()成员函数返

// 回的是*char类型的临时指针,要把返回值赋给某变量名应该用strcpy函数
if(p1-&gt;num!=0)
{
cout&lt;&lt;"请输入图书的价格"&lt;&lt;endl;
cin&gt;&gt;str;
while(!check(str))
{

cout&lt;&lt;"输入的不是数字,请重新输入,按0返回!!";

cin&gt;&gt;str;
}
p1-&gt;price=atof(str.c_str());
//atof会把字符串转化成浮点型数值
}
else
{
delete p1;
p1=NULL;
head=NULL;
return head;
}
while(p1-&gt;num!=0)
{
p2=p1;
p1=new book;
cout&lt;&lt;"请输出图书的编号,以0结束"&lt;&lt;endl;
cin&gt;&gt;str;
while(!check(str))
{

cout&lt;&lt;"输入的不是数字,请重新输入,按0返回!!";

cin&gt;&gt;str;
}
p1-&gt;num=atoi(str.c_str());
if(p1-&gt;num!=0)
{

cout&lt;&lt;"请输入图书的价格"&lt;&lt;endl;

cin&gt;&gt;str;

while(!check(str))

{

cout&lt;&lt;"输入的不是数字,请重新输入,按0返回!!";

cin&gt;&gt;str;

}
p1-&gt;price=atof(str.c_str());
}
p2-&gt;next=p1;
}
delete p1;
p2-&gt;next=NULL;
return head;
}

void showbook(book *head)
{
cout&lt;&lt;endl;
cout&lt;&lt;"图书信息如下:"&lt;&lt;endl;
while(head)
{
cout&lt;&lt;"图书编号:"&lt;&lt;head-&gt;num&lt;&lt;"价格:"&lt;&lt;head-&gt;price&lt;&lt;endl;
head=head-&gt;next;
}

}
book *Delete(book *head,int num)
{
book *l;
if(head-&gt;num==num)
{
l=head;
head=head-&gt;next;
//::head=head;
//赋给全局的head;
delete l;
cout&lt;&lt;"操作成功"&lt;&lt;endl;
return head;
}
while(head)
{
if(head-&gt;next==NULL)
{
cout&lt;&lt;"找不到要删除的编号."&lt;&lt;endl;
return head;
}
if(head-&gt;next-&gt;num==num)
{
l=head-&gt;next;
head-&gt;next=l-&gt;next;
delete l;
cout&lt;&lt;"操作成功"&lt;&lt;endl;
return head;
}
head=head-&gt;next;
}
cout&lt;&lt;"找不到要删除的编号."&lt;&lt;endl;
return head;
}

int main()
{
book *head;
head=creat();
showbook(head);
showbook(head);
cout&lt;&lt;"请输入你要删除的图书编号"&lt;&lt;endl;
int booknum;
cin&gt;&gt;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)

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,