Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中显示LinkedList时的永无止境循环+;_C++_Singly Linked List - Fatal编程技术网

C++ 在C+;中显示LinkedList时的永无止境循环+;

C++ 在C+;中显示LinkedList时的永无止境循环+;,c++,singly-linked-list,C++,Singly Linked List,在下面的代码中,当我在删除第一个元素后尝试显示列表时,它会导致下一个元素的无休止循环。移除除第一个元素以外的其他元素时,不会出现此问题。我不知道为什么会这样?有人能告诉我哪里出了错吗 #include<iostream> using namespace std; class node { public: int data; node *link; }; class linkedlist { node *head; public: linkedlist() {

在下面的代码中,当我在删除第一个元素后尝试显示列表时,它会导致下一个元素的无休止循环。移除除第一个元素以外的其他元素时,不会出现此问题。我不知道为什么会这样?有人能告诉我哪里出了错吗

#include<iostream>

using namespace std;

class node
{
public:
  int data;
  node *link;

};

class linkedlist
{  node *head;
public:
linkedlist()
{
   head=NULL;
}
    int add(int data1)
    { node *insertnode=new node;
        insertnode->data=data1;
        insertnode->link=NULL;

        node *temp=head;

        if(temp!=NULL)
        {
            while(temp->link!=NULL)
            {
                temp=temp->link;
            }
            temp->link=insertnode;

        }
        else{head=insertnode;}

    }
    void disp()
    { node *temp1=head;
    cout<<endl;
    if(temp1==NULL)
    {cout<<"Empty"<<endl;
    }
    if(temp1->link==NULL)
    {
        cout<<temp1->data<<endl;

    }
    else{
    do{cout<<temp1->data<<endl;
    temp1=temp1->link;
    }
    while(temp1!=NULL);
    }

    }

    int remove(int removedata)
    {
        node *temp2=head;
        if(temp2==NULL)
         {}

         if(temp2->link==NULL)
         {
             delete temp2;
             head=NULL;
         }

         else
         {
             node *previous;
             do
             {
                 if(temp2->data==removedata) break;
                 previous=temp2;
                 temp2=temp2->link;
             }while(temp2!=NULL);

            previous->link=temp2->link;
             delete temp2;
         }


    }



};

int main()
{
   linkedlist list;
   list.add(10);
   list.add(100);
   list.add(200);
   list.remove(10);
   list.disp();
}
#包括
使用名称空间std;
类节点
{
公众:
int数据;
节点*链接;
};
类链接列表
{节点*头;
公众:
linkedlist()
{
head=NULL;
}
int add(int data1)
{node*insertnode=新节点;
insertnode->data=data1;
insertnode->link=NULL;
节点*温度=头部;
如果(温度!=NULL)
{
while(临时->链接!=NULL)
{
温度=温度->链接;
}
temp->link=insertnode;
}
else{head=insertnode;}
}
void disp()
{node*temp1=头;

cout当您删除第一个元素时,必须将列表的标题指向下一个元素。您没有在此处执行此操作。

当您删除第一个元素时,必须将列表的标题指向下一个元素。您没有在此处执行此操作。

disp()中
,您可以访问
temp1->link
,无论
temp1
是否为空

if(temp1==NULL)
{cout<<"Empty"<<endl;
}
if(temp1->link==NULL)
{
    cout<<temp1->data<<endl;

}
if(temp1==NULL)
{cout在
disp()
中,无论
temp1
是否为空,您都可以访问
temp1->link

if(temp1==NULL)
{cout<<"Empty"<<endl;
}
if(temp1->link==NULL)
{
    cout<<temp1->data<<endl;

}
if(temp1==NULL)

{cout查看您的删除:

    node *previous;
         do
         {
             if(temp2->data==removedata) break;
             previous=temp2;
             temp2=temp2->link;
         }while(temp2!=NULL);

        previous->link=temp2->link;
         delete temp2;
如果第一个元素是匹配的元素,循环将立即终止,导致取消初始化
上一个
,并且不会更改
temp2
(它仍然是头部)

您现在要做的是:

  • previous->link
    设置为某个值。请注意,这是未定义的行为,因为您不知道
    previous
    是什么
  • 删除
    temp2
    -这是head元素,但决不更改head。这将导致列表中的第一个元素未定义,一旦访问它,任何事情都可能发生(同样,未定义的行为)

  • 因此,基本上-删除第一个元素后-当您尝试显示列表时,任何事情都可能发生-包括您遇到的无限循环。

    查看您的删除:

        node *previous;
             do
             {
                 if(temp2->data==removedata) break;
                 previous=temp2;
                 temp2=temp2->link;
             }while(temp2!=NULL);
    
            previous->link=temp2->link;
             delete temp2;
    
    如果第一个元素是匹配的元素,循环将立即终止,导致取消初始化
    上一个
    ,并且不会更改
    temp2
    (它仍然是头部)

    您现在要做的是:

  • previous->link
    设置为某个值。请注意,这是未定义的行为,因为您不知道
    previous
    是什么
  • 删除
    temp2
    -这是head元素,但决不更改head。这将导致列表中的第一个元素未定义,一旦访问它,任何事情都可能发生(同样,未定义的行为)

  • 因此,基本上-删除第一个元素后-当您尝试显示列表时,任何事情都可能发生-包括您遇到的无限循环。

    您没有调整指向头部的指针。猜测这就是它失败的原因。

    您没有调整指向头部的指针。猜测这就是它失败的原因。

    如果没有,请显示输出这里是列表中的一个循环,这种行为是预期的-如果没有一些额外的workId,您无法真正知道列表何时结束,您尝试调试它?
    如果(temp2==NULL){}
    ??在第一次插入时会发生什么(head为NULL)?移除第一个元素时,循环后的
    previous
    temp2
    值是多少?移除后的
    head
    值是多少?(铅笔和纸是这里最好的调试工具。)如果列表中有一个循环,请向我们显示输出,这种行为是预期的-如果没有一些额外的workId,您无法真正知道列表何时结束,您尝试调试它?
    如果(temp2==NULL){}
    ??在第一次插入时会发生什么(head为NULL)?移除第一个元素时,循环后的
    previous
    temp2
    值是多少?移除后的
    head
    值是多少?(铅笔和纸是这里最好的调试工具。)谢谢。现在我已经纠正了。现在面临完全不同的问题。我已经在中添加了详细信息edit@Vinay:如果它解决了你的上一个问题,而你遇到了一个新问题,你可能应该把它作为一个新问题发布。谢谢,伙计。我将把它作为一个新问题发布。我已经接受了你的答案。:)并不是完全无关的。你只有y解决了一半的问题,
    head
    在删除第一个元素时没有被设置。@Johnsyweb:我想我是这样做的:“2…但永远不要更改head。这将导致列表中的第一个元素未定义”谢谢。现在我已经纠正了。现在面临完全不同的问题。我已经在中添加了详细信息edit@Vinay:如果它解决了你的上一个问题,而你遇到了一个新问题,你可能应该把它作为一个新问题发布。谢谢,伙计。我将把它作为一个新问题发布。我已经接受了你的答案。:)并不是完全无关的。你只有y解决了一半的问题,
    head
    在删除第一个元素时没有被设置。@Johnsyweb:我想我是这样做的:“2…但永远不要更改head。这将导致列表中的第一个元素未定义”