在c++中删除第n个节点
delete a node at nth position IN C++
我有问题从链表中给定的任意位置删除。我成功地找到了列表的第一个位置和最后一个位置,但在找到第n个位置时出现了运行时错误。
struct node
{
int number;
node *next;
};
struct Box
{
void insertAsFirstElement(node *&head, node *&last,int number);
void insert(node *&head, node *&last,int number);
void remove(node *&head, node *&last);
void showList(node *current);
};
bool isEmpty(node *head) {
return head == NULL;
}
char menu() {
char choice;
cout<<"Menu"<<"1. Add an item.n"<<"2. Remove an item.n"<<"3. Show the list.n"<<"Exitn";
cin >> choice;
return choice;
}
void insertAsFirstElement(node *&head, node *&last,int number) {
node *temp = new node;
temp->number = number;
temp->next = NULL;
head = temp;
last = temp;
}
void insert(node *&head, node *&last,int number) {
if(isEmpty(head))
insertAsFirstElement(head, last, number);
else {
node *temp = new node;
temp->number = number;
temp->next = NULL;
last->next = temp;
last = temp;
}
}
void remove(node *&head, node *&last,int number) {
cin>>number;
node *temp = new node;
if(isEmpty(head))
cout<< "this list is already empty.n";
else if (head == last) {
delete head;
head = NULL;
last = NULL;
} else {
for(int i = 0; 1< number-2; i++)
/*node *temp = head;
head = head->next;
delete temp;*/
node *temp = head;
head = head->next;
temp= temp->next;
node* temp2 = temp->next;
temp->next = temp2->next;
delete temp2;
}
}
void showList(node *current) {
if(isEmpty(current))
cout << "The list is emptyn";
else {
cout << "The list contains:n";
while(current != NULL) {
cout << current->number << endl;
current = current->next;
}
}
}
int main() {
node *head = NULL;
node *last = NULL;
char choice;
int number;
do{
choice = menu();
switch (choice) {
case'1':
cout << "please enter a number: ";
cin >> number;
insert (head,last,number);
break;
case'2':
remove(head,last,number);
break;
case '3':
showList(head);
break;
default:
cout<< "System exitn";
}
}while (choice !='4');
}
你的删除函数中的循环条件是错误的,它没有检查任何受循环影响的东西,所以它会永远运行下去(或者更有可能,直到它打破了一些东西)。
另外,你的remove
与它的签名不匹配。因为你没有真正解释你想要它做什么,很难说如何修复它- number
是你想要删除的值(如果有多个值呢?)它是要删除的索引吗?是要移除的元素数量吗?
我假设它是第二个,因为它似乎是你想要做的。在任何情况下,您都需要在删除该项目之前搜索,因此,而不是-
for(int i = 0; 1< number-2; i++)
试
for(int i = 0; i < number-1; i++)
1可能是一个打字错误,它足以在前面停止一个元素(索引的含义由您决定,但如果头部为0,则删除索引2应该运行循环一次)
然后,您需要在循环周围加上括号,因为现在您只循环第一行代码。把temp = head
的赋值移到循环前面,你只需要做一次,然后循环
temp= temp->next;
(如果这是你唯一的一行,你不需要括号,但这是一个好习惯)。这会把你带到索引前面的元素。如果这是头,您需要一些特殊处理,但除此之外不要改变head
,否则您将失去您想要保留的元素。
实际的删除看起来可能会工作,但每次你解引用next
,你需要确保它不是NULL
相关文章:
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 为什么"delete"关键字不删除节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 删除 XML 文件中的子节点C++
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 从unordered_map中删除单个节点
- 删除链表中的特定节点
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 删除链表中的节点 - 分段错误
- 删除链接列表中剩余的最后一个节点
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 使用函数引用指向节点的指针删除链表中的节点?
- 双向链表 - 无法删除第一个节点
- 双向链表 std::unique_ptr 类在节点删除时无法按预期工作
- BST 节点删除 - 指针未正确删除
- 节点删除功能的链表问题
- 布尔函数始终为真,单向链表中的尾节点删除创建无限循环
- AVL树中节点删除值异常