функция удаления связанного списка - PullRequest
2 голосов
/ 18 июня 2011

Следующий фрагмент кода не работает правильно.

void deleteNode(list **start, int pos) {
    int currentPosition=0;
    list *currentNode;
    list *nodToDelete;

    currentNode = *start;
    if (currentNode == NULL) {
        printf("Empty List\n");
    } else if (pos == 0 ) {
        nodToDelete = *start;
        *start = nodToDelete->next;
        free(nodToDelete);
    } else {
        while (currentNode->next != NULL) {
            if (currentPosition >= pos -1) {
                break;
            }
            currentPosition++;
            currentNode = currentNode->next;
        }
        if (currentPosition < pos -1 || currentNode->next == NULL) {
            printf("No node at given position exists\n");
        } else {
            nodToDelete = currentNode->next;
            currentNode = nodToDelete->next;
            free(nodToDelete);
            nodToDelete = NULL;
        }
    }
}

void displayList(list *node) {
    if (node == NULL) {
        printf("Empty List");
    }

    while (node != NULL) {
        printf("%d\t", node->data);
        node = node->next;
    }
    printf("\n");
}

int main()
{
    list *start, *node;
    start = NULL;

    insertNode(&start, 2);
    insertNode(&start, 3);
    insertNode(&start, 4);
    insertNode(&start, 1);
    insertNode(&start, 5);

    deleteNode(&start, 3);

    displayList(start);
}

При выполнении вывод

Перед удалением 2 3 4 1 5
После удаления 2 3 4 0 5

Предполагается удалить 1, но на его месте вставляется 0.

Ответы [ 3 ]

2 голосов
/ 18 июня 2011

Вот то, что может работать - Заменить

currentNode = nodToDelete->next;

с

currentNode->next = nodToDelete->next;

Вам в основном нужно, чтобы узел перед узловым удалением имел следующую точку, чтобы указывать на узел, который использовался для удаления узла

1 голос
/ 18 июня 2011

Помимо проблемы с currentNode->next = nodToDelete->next; и отрицательными позициями, вы смешиваете свой интерфейс и свою логику.По возможности, вы должны разделить их.

Отправка чего-либо в пользовательский интерфейс - это способ сообщить о прогрессе;является ли пользовательский интерфейс командной строкой, браузером или динамиком.В пределах deleteNode пустой список или позиция, которая находится за пределами границ, не является прогрессом.Последовательность обоих одинакова с успехом - все готово.Если вы хотите, чтобы о сбое сообщалось, это должно быть сделано там, где это может привести к отдельной последовательности ... т.е. к вызывающей стороне.Кроме того, смешивая в пользовательском интерфейсе, вы вводите ненужные зависимости и ошибки (что, если в printf есть ошибка, ВАША функция будет аварийно завершать работу, когда в этом нет необходимости).Если ваша функция возвращает определенный результат, вызывающая сторона может решить, если / как сообщить об этом результате, включая успех (ваша функция в настоящее время не делает этого, и вызывающая сторона не может определить разницу между успехом или неудачей).

1 голос
/ 18 июня 2011

Как только вы нашли узел, который вы хотите вычеркнуть из списка, вы должны фактически удалить его. =) * * Тысяча одна

...

nodToDelete = currentNode->next;
currentNode->next = nodToDelete->next;
free(nodToDelete);

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...