【问题标题】:delete a node at nth position IN C++在 C++ 中删除第 n 个位置的节点
【发布时间】:2015-10-24 05:20:31
【问题描述】:

我在从链表中给定的任意位置删除时遇到问题。我成功获得了列表的第一个位置和最后一个位置,但在获得第 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"<<"Exit\n";
    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 empty\n";
    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 exit\n";
        }
    }while (choice !='4');
}

【问题讨论】:

  • 什么运行时错误?它对应于哪一行?到目前为止你做了哪些调试?
  • 当我尝试从列表中的位置删除时会出错
  • @KingJosh WHAT 错误具体是什么?
  • 它没有明确说明错误的种类。这是一个运行时错误,当我尝试从程序停止的位置删除并说“窗口出现问题............”然后程序结束
  • 但添加到列表中效果很好

标签: c++ c++11 visual-c++


【解决方案1】:

您在删除函数中的循环条件是错误的,它没有检查任何受循环影响的东西,所以它会永远运行(或者更有可能,直到它破坏某些东西)。

此外,您的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。

【讨论】:

  • 非常感谢。我会尝试实现它,看看它是否有效。
  • 我刚刚实现了它,它可以工作,但只会删除我列表的中间元素,尽管我输入了我想要删除的位置。请问我如何使它成为我想要删除的位置如果我使用数字来确定位置,我如何使它从我想要的位置删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2020-11-17
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多