今晚就编译了一个动态链表来实验图书编号价格代码,可能不是很完善很简明 希望大家给与建议,下面是实现代码和运行结果:
#include"stdafx.h"
#include<iostream>
#include<string>
using namespace std;
class Book
{
public:
int num;
float price;
Book*next;
};
Book*head=NULL;//创建类Book的一个头指针并且赋空;
bool check(string str)//bool型函数,接收参数是字符串
{
for(int i=0;i<str.length();i++)
{
if((str[i]>'9'||str[i]<'0')&&(str[i]!=','))//0-9之外就是输入的为字符,而且我们要确保小数点不算在其中
return false;//若含有字符串就返回假,否则返回真
else
return true;
}
}
Book*creat()//f返回Book类的指针
{
Book*p1,*p2;//创建了两个节点p1,p2
p1=new Book;//new关键字创建一个节点,用p1指向它
head=p1;//把p1节点作为头节点赋给head指针
p2=p1;//这里把p1也赋给p2节点
cout<<"请输入图书的编号,以0结束"<<endl;
string str;
cin>>str;
while(!check(str))//因为while循环需要为1时候才运行循环,上面的bool型变量输入字符时返回false,所有我们需要让用户
{ //在这个循环中重新输入,即需要进入while循环,即是让条件加!即满足while循环可以进行循环
cout<<"输入的不是数字,请重新输入,按0返回!"<<endl;
cin>>str;
}
p1->num=atoi(str.c_str());//这里将字符串转换为整数
if(p1->num!=0)
{
cout<<"请输入图书的价格:"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!"<<endl;
cin>>str;
}
p1->price=atof(str.c_str());//这里将字符串转换为浮点型变量
}
else
{
delete p1;p2=NULL;p2->next=NULL;head=NULL;//因为删除p1指针,就是p2和p2next指针都不存在需要赋空,同意head指针也需要赋空
return head; //这里说白就是num=0,则后面的节点都要赋空,没必要使用了
}
while(p1->num!=0)//这里如果节点p1的num不为0,则执行循环,while循环无法对字符串进行判断,需要使用bool变量
{
p2=p1;//这里把p1节点赋给p2
p1=new Book;//这里创建一个新节点赋给p1;
cout<<"请输入图书的编号,以0结束"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!"<<endl;
cin>>str;
}
p1->num=atoi(str.c_str());//这里将字符串转换为整数
if(p1->num!=0)
{
cout<<"请输入图书的价格:"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!"<<endl;
cin>>str;
}
p1->price=atof(str.c_str());//这里将字符串转换为浮点型变量
}
p2->next=p1;//这里把p1赋给p2的next指针,即p1为下一个节点
} //这里需要注意就是把谁的地址或者指针赋值别人的next指针,即告诉编译器下一个节点就是
delete p1;
p2->next=NULL;
return head;
}
void showbook(Book*head)
{
cout<<endl;
cout<<"图书信息如下:"<<endl;
while(head)
{
cout<<"图书的编号为:"<<head->num<<"\t";
cout<<"价格: "<<head->price<<endl;
head=head->next;
}
}
int main()
{
Book*head=NULL;
head=creat();
showbook(head);
system("pause");
return 0;
}