Удаление связанного списка узлов


Это классическая проблема, связанная списка.

  1. Удаление узла из связанного списка с учетом данных, которые будут удалены.
  2. Вставка узла в список, отсортированный связаны.

Я видел разные версии этой и вот моя версия. Не могли бы вы проверить и дайте мне знать, если этот код является эффективным?

void deletenode(struct node *&first, int data) 
{
    struct node * current = first;// first will have the node after deletion

    struct node * prev = (node *)malloc(sizeof(node));
    while(current!=NULL)
    {
        if(current->data!=data)
        {
            prev=current;
            current = current->next;
        }
        else
        {
            prev->next = current->next;
            delete current;
            break;
        }
    }
}

void insertinsortedlist(struct node *& first, int data)
{
    struct node * current = first;// first will have the node after insertion
    struct node * newnode = (node *)malloc(sizeof(node));
    newnode->data = data;
    struct node * temp = (node *)malloc(sizeof(node));
    while(current)
    {
        if((current->data < data) && (current->next->data > data))
        {
            temp = current->next;
            current->next = newnode;
            newnode->next = temp;
            break;
        }
        current = current->next;
    }
}


38791
3
задан 27 марта 2011 в 01:03 Источник Поделиться
Комментарии
1 ответ

Эффективность вашего алгоритма-это хорошо, однако есть несколько других вещей, которые вы должны позаботиться о:

Прежде всего делать не освободить память, которая была выделена с помощью функции malloc, использовать удалить. Удалить для освобождения памяти, которая была выделена с новой. Чтобы бесплатно ТаносЭд памяти использовать бесплатно. Используя удалить на ТаносЭд памяти-это неправильно и приводит к неопределенному поведению.

Также там почти никогда не хорошая причина, чтобы использовать функции malloc в C++ код. Если есть сомнения использовать новые и удалять.

Еще одна серьезная ошибка в вашем коде заключается в том, что вы выделяете память для пред' в deletenode, но никогда не освободить его.


Я тоже не понимаю, почему вы проходите в первый как ссылка на указатель. Поскольку ты никогда не изменишься во-первых, я не вижу никаких причин, чтобы не принимать его в качестве обычного указателя (или простой справочник, который вы затем взять адрес, чтобы назначить к текущей).


Другое дело, что вам не нужно добавить в структуру сайта при объявлении переменных или параметров, содержащие структуры в C++ - это вещь. Вы должны удалить его, как только добавляет шума.

10
ответ дан 27 марта 2011 в 03:03 Источник Поделиться