2016-08-16 59 views
-2

我试图删除链接列表上的节点,但删除命令后,我试图显示节点内的数据,我仍然可以显示所谓的删除数据。搜索是节点即时试图通过delete d指针删除删除节点不会工作

int position=0; 
    while(admintemp !=NULL) 
    { 
     position=position+1; 
     if(admintemp==search) 
     { 
      cout<<"found"<<position; 
      getch(); 
      break; 

     } 
     admintemp = admintemp->next;  
    } 


    node *body = new node; 
    node *admintemp = new node; 
    if(position>0) 
    { 
     admintemp = adminhead; 

     for (int i= 1;i<position;i++) 
     { 
      body = admintemp; 
      admintemp = admintemp->next; 
     } 
     body->next=admintemp->next; 
     cout<<"deleting"; 
     getch(); 
     delete admintemp; 
    }  
+2

解决此类问题的正确工具是使用您的调试器,但不要在堆栈溢出之前询问。告诉我们您在检查您的代码时所做的所有观察。您也可以阅读[**如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)**] At最少给我们留下一个** [MCVE] **,它可以再现您的问题。 (这是个人评论由πάνταῥεῖ™提供) –

+0

@πάνταῥεῖ该程序实际执行。调试器和编译器无法找到任何错误。删除节点后,我试图遍历列表并且程序崩溃。 –

+1

了解如何真正使用调试器! –

回答

2

读取数据是“未定义行为” - 这意味着编译器可以做什么它为所欲为,你的程序有没有意义。

可能得到你所期望的结果,你可以得到崩溃,你可以得到恶魔飞出你的鼻子。没有办法告诉。该程序根本无效,并且任何行为都可以。按照C++标准的规则,程序员负责而不是调用未定义的行为 - 它可以可能编译和运行,但是你已经违反了规则,因此编译器没有义务做任何理智的事情(甚至任何事情完全)。

+0

当我尝试在删除后遍历列表。它在节点上显示一些数据然后崩溃。这是因为“未定义的行为”? –

+0

这是允许的。至于没有做任何事情。正如重新启动您的电脑。 “未定义的行为”的意思是“你违背了规则,做了你所做的事情,编译器现在可以做*任何它想做的事情*” - 它实际上有*无义务*。解决这个问题的方法是“*停止这样做*”。 –

+0

问题是因为我在试用期间删除了头节点。如果程序应该这样做,我添加了几行删除头节点。工作正常,我猜。谢谢 –