C++ 插入函数为';不要添加新元素

C++ 插入函数为';不要添加新元素,c++,C++,我写了一个程序,该程序应该在列表中插入元素,并与它们的成本进行比较,但它不起作用。我输入一个元素,然后程序就不工作了。我不明白怎么了 下面是一个与练习完全相同的示例: 修改列表,使列表中的元素按价格排序。添加到列表中的新项目应插入到正确的位置 #包括 #包括 使用名称空间std; 类型定义结构列表 { 字符串名; 浮动价格; 结构列表*下一步; }利斯特; typedef listt*listPtr; void insertt(listPtr*、字符串、浮点); 作废打印列表(listPtr);

我写了一个程序,该程序应该在列表中插入元素,并与它们的成本进行比较,但它不起作用。我输入一个元素,然后程序就不工作了。我不明白怎么了

下面是一个与练习完全相同的示例:

修改列表,使列表中的元素按价格排序。添加到列表中的新项目应插入到正确的位置
#包括
#包括
使用名称空间std;
类型定义结构列表
{
字符串名;
浮动价格;
结构列表*下一步;
}利斯特;
typedef listt*listPtr;
void insertt(listPtr*、字符串、浮点);
作废打印列表(listPtr);
无效指令();
int main()
{
无符号整数选择;
浮动成本;
字符串itemName;
listPtr head=NULL;
指令();
cin>>选择;
while(选项!=3)
{
开关(选择)
{
案例1:
cout项目名称;
cout-next=newPtr;
newPtr->next=currentPt;
}
}
无效打印列表(列表PTR hh)
{
while(hh->next!=NULL)
{
插图中的cout name:

newPtr未初始化,但您将其值与NULL进行比较,然后可能会修改未知内存块,这是一种未定义的行为

listPtr newPtr;
替换为
listPtr newPtr=new listt;

这是因为
typedef listt*listPtr;
隐藏指针,不要定义typedef隐藏指针,这始终是问题的根源

您插入新单元格的方式是错误的,例如,如果第二个插入单元格的价格低于第一个插入单元格的价格,则您非法访问了内存。有效的解决方案是:

void insertt(listt ** itemList, string nm, float cst)
{
    listt * newCell = new listt;

    newCell->name = nm;
    newCell->price = cst;
    newCell->next = nullptr;

    if (*itemList == nullptr)
      *itemList = newCell;
    else {
      for (;;) {
        if (cst < (*itemList)->price) {
          newCell->next = *itemList;
          *itemList = newCell;
          return;
        }
        if ((*itemList)->next == nullptr) {
          (*itemList)->next = newCell;
          return;
        }
        itemList = &(*itemList)->next;
      }
    }
}

或者更好

while(hh != nullptr)

您的
struct-listt
的定义与C中的定义类似

您还需要检查您的输入是否有效,您的
cin>>x;
必须是
if(!(cin>>x)){..error management..}

void insertt(listt ** itemList, string nm, float cst)
{
    listt * newCell = new listt;

    newCell->name = nm;
    newCell->price = cst;
    newCell->next = nullptr;

    if (*itemList == nullptr)
      *itemList = newCell;
    else {
      for (;;) {
        if (cst < (*itemList)->price) {
          newCell->next = *itemList;
          *itemList = newCell;
          return;
        }
        if ((*itemList)->next == nullptr) {
          (*itemList)->next = newCell;
          return;
        }
        itemList = &(*itemList)->next;
      }
    }
}
  while(hh->next != NULL)
while(hh != NULL)
while(hh != nullptr)