Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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++_Pointers_Dynamic_Linked List_Structure - Fatal编程技术网

C++ 如何删除链接列表中的特定节点

C++ 如何删除链接列表中的特定节点,c++,pointers,dynamic,linked-list,structure,C++,Pointers,Dynamic,Linked List,Structure,我面临的问题是,我似乎无法找到一个特定的节点,然后从链接列表中删除该节点。我尝试创建最后显示的while循环,将包含节点的head的内存分配循环两次,然后将其删除,但如果将deleteNode设置为2,则似乎会同时删除两个节点 void delete_列表(书*&头,书*&末){ if(head==NULL) { 不能删除节点; 书本*新书本=头部; 而(删除节点>0){ 头部=头部->下一步; 删除节点--; } 删除新书; } } #包括 #包括 使用名称空间std; 结构书{ 字符串标

我面临的问题是,我似乎无法找到一个特定的节点,然后从链接列表中删除该节点。我尝试创建最后显示的while循环,将包含节点的head的内存分配循环两次,然后将其删除,但如果将
deleteNode
设置为2,则似乎会同时删除两个节点

void delete_列表(书*&头,书*&末){
if(head==NULL)
{
不能删除节点;
书本*新书本=头部;
而(删除节点>0){
头部=头部->下一步;
删除节点--;
}
删除新书;
}
}

#包括
#包括
使用名称空间std;
结构书{
字符串标题;
字符串作者;
字符串发布器;
国际出版年;
国际标准书号;
书*下一页;
};
void add_节点(Book*&,Book*&);
作废印刷清单(书籍*);
作废删除清单(账簿*&,账簿*&);
int-deleteNode;
int main()
{
Book*head=NULL;
Book*last=NULL;
字符选项;
做{
cout>选项;
开关(选件){
案例“A”:
添加_节点(头,最后);
打破
案例“P”:
打印列表(标题);
打破
案例“D”:
删除_列表(标题、最后一个);
案例‘Q’:
打破
违约:
库特新书->作者;
cout>新书->出版商;
cout>新书->出版年;
cout>新书->isbn;
新建图书->下一步=NULL;
head=新书;
最后一本=新书;
}
其他的
{
Book*new_book1=新书;
cout new_book1->title;
cout>新书1>作者;
cout>新书1>出版商;
cout>新书1>出版年份;
cout>new_book1->isbn;
上一次->下一次=新建书籍1;
最后=新的书籍1;
}
}
无效打印列表(书本*在根目录中){
书籍*下一页;
next_ptr=在_根中;
if(next_ptr==NULL)
{

cout你很接近了。这里有几个问题。首先,当你查看列表时,你正在主动重新分配head指针,因此从列表中释放节点。你应该为current创建一个临时节点,通常称为
curr
。然后设置
curr=head
,并在e当循环执行时
curr=curr->next


另一个问题是,删除列表中间的一个节点,将列表有效地切成两块,但不要将这两个部分放在一起。您需要另一个临时变量指向要删除的节点,<代码> Boo> DeleTeMe=Cur->下一个。设置<代码> Curr- > Next=Curr- > Next > >下一个< /Cord> >code>delete delete me

您没有更新被删除节点周围的节点。从列表的前面或后面删除节点时,您没有更新
head
last
指针。而您只是在迭代列表时更新调用方的
head
指针,实际上会破坏g来电者名单

请尝试以下方法:

void delete_列表(书*&头,书*&末)
{
如果(!头)
{
不能删除节点;
if(deleteNode<1)
{
(表0)
{
以前的=书;
书本=书本->下一步;
}
如果(!书本)
{
cout next=书本->下一步;
if(head==book)
头=书->下一步;
如果(最后==书本)
最后一次=上一次;
删除书籍;
}
}
也就是说,您的代码还存在一些其他问题。请尝试类似以下内容:

#包括
#包括
#包括
使用名称空间std;
结构书
{
字符串标题;
字符串作者;
字符串发布器;
国际出版年;
国际标准书号;
书*下一页;
};
void add_节点(Book*&,Book*&);
作废印刷清单(书籍*);
作废删除清单(账簿*&,账簿*&);
int main()
{
Book*head=NULL;
Book*last=NULL;
字符选项;
做
{
cout>选项)
{
选项='\0';
cin.clear();
cin.ignore(数值限制::max(),'\n');
持续
}
开关(选件)
{
案例“A”:
添加_节点(头,最后);
打破
案例“P”:
打印列表(标题);
打破
案例“D”:
删除_列表(标题、最后一个);
打破
案例‘Q’:
打破
违约:
每年出版一次;
cin.ignore(数值限制::max(),'\n');
cout>新书->isbn;
cin.ignore(数值限制::max(),'\n');
新建图书->下一步=NULL;
//检查空链接列表
如果(!头){
头=最后一本=新书;
}
其他的
{
最后->下一步=新书;
最后一本=新书;
}
}
作废打印列表(书本*根目录)
{
如果(!root)
{

请给我们提供一个完整的工作示例,这样我们可以很容易地测试它。我喜欢函数参数是参考的pointers@NutCracker我已经提供了完整的代码。它应该是一个程序,将书籍信息存储在节点的动态内存中,用户可以删除特定的书籍及其所有信息删除一个节点中的任何节点le链表涉及一件事:找到指向该节点的指针并从列表中删除该节点。该指针可以是(a)头指针,或(b)其他节点中的某个下一个指针。没有其他选项。仅供参考,使用指向指针的指针遍历实际列表时,这更容易(imho)。