我对这段代码有几个问题;
首先
,如果我运行它,那么我选择PUSH并输入两个名字,如"Emily Glassberg",它会进入无限循环,但如果我只输入一个名字,如"迈克尔",它的效果很好。问题图片.
其次,在我运行代码后,当我
- 选择"推送">-键入一个名称-
- 然后选择"删除">
- 然后选择"PUSH" - 并再次输入一个名称 - 程序崩溃,
如果我仅在输入任何名称之前选择"删除">,它甚至崩溃.
问题 2.1 图片
问题 2.2 图片
#include<iostream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
struct Queue
{
struct node
{
node *next;
string name;
};
node *head;
int front=-1,rare=-1;
void push(string x)
{
if (rare < 0 )
{
head =new node;
head->next=NULL;
head->name=x;
rare ++;
}
else
{
node *temp,*temp1;
temp=head;
while(temp->next != NULL){temp=temp->next;}
temp1=new node;
temp->next=temp1;
temp1->next=NULL;
temp1->name=x;
}
}
void display()
{
node *temp;
temp=head;
if (rare < 0)
{
cout <<"Queue under flow";
return;
}
cout<<"nthe queue is: nn";
while(temp != NULL)
{
cout <<temp->name<<endl;
temp=temp->next;
}
}
void pop()
{
if( rare < 0)
{
cout <<"Queue under flown";
return;
}
if(front == rare)
{
front = rare =-1;
head=NULL;
return;
}
front++;
head=head->next;
}
Queue Delete(Queue q){
node* temp = head;
while (head != nullptr){
head = head->next;
delete temp;
temp = head;
}
head = nullptr;
}
};
main()
{
Queue q1;
string x;
int ch;
while(true)
{
cout<<"1.PUSHn2.POPn3.DISPLAYn4.DELETEn5.EXITnenter Ur choice:n";
cin >> ch;
switch(ch)
{
case 1:
cout <<"plz,enter the name n";
cin >> x;
q1.push(x);
cout<<"n";
break;
case 2:
q1.pop();
break;
case 3:
q1.display();
cout<<"n";
break;
case 4:
q1.Delete(q1);
break;
case 5:
exit(0);
default :
cout<<"error selection.plz,try againn";
}
}
return (0);
}
我认为你的问题是在"迈克尔"这个名字中,没有空格,但在"艾米丽格拉斯伯格"中,有。我相信 std::cin 很难处理这个问题,所以你应该使用 std::getline 并将 ch 更改为 std::string(你必须为此包含(。代码需要看起来像这样才能正常工作:
ch.clear();
int chInt;
while(ch.size() == 0) {
std::getline(std::cin, ch);
}
chInt = std::stoi(ch);
//Handle the input here
你需要循环,因为无论出于何种原因,std::getline 倾向于只尝试从用户那里获取一次输入,无论出于何种原因,然后继续前进,所以通过循环直到用户输入了一些东西,我们可以确保始终采用正确的输入。事先清除字符串也非常重要,这样我们就不会在任何将来的输入收集器中自动使用最后一个输入。最后,行chInt = std::stoi(ch);
转换我们刚刚从用户那里收集的字符串,将其转换为 int,然后将其分配给 chInt(因此在您的switch
语句中,您将使用 chInt 而不是 ch(。实施此修复程序在问题的后半部分也可能有帮助。
-
没有 PUSH 的第一次删除不起作用,因为头部指针未初始化,然后行:head = head->next 会导致错误。您必须在构造函数中将 head 初始化为 null,在 Delete 中,您必须验证 head 是否与该 null 不同。
-
在推送中:
while(temp->next != NULL( { temp=temp->next; }
当 temp=NULL 时,则条件 temp->next 崩溃,因为 temp 为空。通过 while(temp!=null( 或这样更改条件:while(temp != null && temp->next!=null(
-
辛>> X. 当你输入"艾米丽·格拉斯伯格"时,cin 阅读艾米丽并返回。下一个循环 cin> ch 返回 "Glassberg" 然后不是有效的选项并循环无限。在 PUSH 选项中使用 cin.getline((,而不是 cin>> x。
-
在"删除"中,您必须将 -1 设置为 bare 因为下一个 PUSH 未初始化磁头。此外,您必须以递归形式删除。