Проблема со связанным списком с циклом while, мне следует использовать продолжение? - PullRequest
0 голосов
/ 20 февраля 2019

Мне нужно распечатать каждое уникальное целое число в связанном списке, оказалось, что оно ничего не печатает. Я попытался использовать продолжить и удалить остальное, но при этом я получил только первый уникальный элемент в связанном списке.Мой вопрос заключается в том, что продолжить завершить цикл или просто пропустить текущую итерацию?Если он пропускает только текущий, скажем, у меня есть связанный список, который выглядит как 1-> 5, почему я здесь печатаю только 1?Заранее спасибо.

 struct node {
    int data; 
    struct node* next; 
 }


void printList(struct node *head)  // print out unique items of the list
{

    struct node *ptr = head;
    struct node *prev = NULL;

    while(ptr != NULL)
    {

        if(prev->data == ptr->data)
        {
            prev = ptr;
            ptr = ptr->next;

        }else{
        printf("%d", ptr->data);
        prev = ptr;
        ptr = ptr->next;

        }

    }
}

1 Ответ

0 голосов
/ 21 февраля 2019

Код, как написано, генерирует ошибку сегментации, потому что вы ссылаетесь на нулевой указатель.В этой строке:

if(prev->data == ptr->data)

Поскольку prev имеет значение NULL для запуска, prev->data разыменует указатель NULL и завершит работу программы.Это не объясняет, почему вы видели, что он не печатает последний элемент, но написанный код определенно не работает.

Попробуйте:

void printList(struct node *head)  // print out unique items of the list
{

    struct node *ptr = head;
    struct node *prev = NULL;

    while (ptr != NULL)
    {
        // Check if prev is NULL, and if not, that prev->data and ptr->data
        // don't match.
        if (! prev || ptr->data != prev->data)
        {
            printf("%d\n", ptr->data);
        }

        prev = ptr;
        ptr = ptr->next;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...