删除第n个位置的节点IN C ++

时间:2015-08-01 18:02:11

标签: c++ c++11 visual-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"<<"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');
}

1 个答案:

答案 0 :(得分:0)

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

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