在c++中删除第n个节点

delete a node at nth position IN C++

本文关键字:节点 删除 c++      更新时间:2023-10-16

我有问题从链表中给定的任意位置删除。我成功地找到了列表的第一个位置和最后一个位置,但在找到第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