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

Ниже приведен мой код, чтобы попытаться создать связанный список из 10 целых чисел.Затем пройти по списку, наполовину четные числа и удвоить нечетные.Я посмотрел в Интернете, чтобы увидеть, как создать список с использованием функции.Я интерпретировал это, чтобы написать функцию в коде, показанном ниже: "void createList ()".Код компилируется нормально, но когда я его запускаю, я получаю только следующий вывод:

Исходный список:

Обновленный список:

Кто-нибудь знает, откуда возникла проблема?Это из функции createList или из функции отображения?Или даже в другом месте?

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

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

void freeList();
void update();
void createList();
void display();
struct node* root = NULL;

int main(void)
{
    srand(time(NULL));
    createList((rand() % 10) + 1);
    createList();
    createList();
    createList();
    createList();
    createList();
    createList();
    createList();
    createList();
    createList();

    printf("Original list:");
    display();


    update();


    printf("\nUpdated list:");
    display();

    freeList();

    return 0;
}


void createList()
{
    struct node* tmp;
    tmp = malloc(sizeof(struct node));
    tmp->data = (rand() % 10) + 1;
    tmp->next = NULL;

    if (root == NULL)
    {
        root = tmp;
    }
    else
    {
        struct node* p;
        p = root;

        while (p->next != NULL)
        {
            p = p->next;
        } 
        p->next = tmp;
    }
}

void display()
{
    struct node* tmp;
    tmp = root;
    if (tmp = NULL)
    {
        printf("list is empty.\n");
    }
    else
    {
        while(tmp != NULL)
        {
            printf("\t%d", tmp->data);
            tmp = tmp->next;
        } 
        printf("\n");
    }
}


void freeList()
{

    struct node* tmp;
    tmp = root;
    if (tmp = NULL)
    {
        printf("list is empty.\n");
    }
    else
    {
        while (tmp != NULL)
        {
            free(tmp);
            tmp = tmp->next;
        } 
        printf("\n");

    }
}

void update()
{
    struct node* tmp;
    tmp = root;
    if (tmp = NULL)
    {
        printf("list is empty.\n");
    }  
    else
    { 
        while (tmp != NULL)
        { 
            if (root->data % 2 == 0)
            {
                root->data = root->data / 2;
            }
            else
            {
                root->data = root->data * 2;
            }
            printf("\t%d", root->data);
            root = root->next;
        }

    }
}

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

В display и в других местах у вас есть

if (tmp = NULL)

Это явно неверно, поскольку присваивает NULL tmp, делая его похожим на список нулевой длины.

КогдаЯ скомпилировал вашу программу (используя clang) и получил следующий вывод:

jeremyp@Magenta:jeremyp% cc foo.c
foo.c:75:13: warning: using the result of an assignment as a condition without
      parentheses [-Wparentheses]
    if (tmp = NULL)
        ~~~~^~~~~~
foo.c:75:13: note: place parentheses around the assignment to silence this
      warning
    if (tmp = NULL)
            ^
        (         )
foo.c:75:13: note: use '==' to turn this assignment into an equality comparison
    if (tmp = NULL)
            ^
            ==
foo.c:96:13: warning: using the result of an assignment as a condition without
      parentheses [-Wparentheses]
    if (tmp = NULL)
        ~~~~^~~~~~
foo.c:96:13: note: place parentheses around the assignment to silence this
      warning
    if (tmp = NULL)
            ^
        (         )
foo.c:96:13: note: use '==' to turn this assignment into an equality comparison
    if (tmp = NULL)
            ^
            ==
foo.c:116:13: warning: using the result of an assignment as a condition without
      parentheses [-Wparentheses]
    if (tmp = NULL)
        ~~~~^~~~~~
foo.c:116:13: note: place parentheses around the assignment to silence this
      warning
    if (tmp = NULL)
            ^
        (         )
foo.c:116:13: note: use '==' to turn this assignment into an equality comparison
    if (tmp = NULL)
            ^
            ==
3 warnings generated.

Вероятно, вы используете либо clang, либо gcc, оба из которых будут отображать предупреждения, похожие на приведенные выше.Мой совет: не игнорируйте предупреждения, даже если испускается исполняемый файл .

Если ваш компилятор не выдает предупреждения по коду в вашем вопросе (даже с переключателем -Wall), выбрось это и получи лучше.У меня есть многолетний опыт, когда я узнаю, что игнорирование предупреждений вызывает много дополнительной работы и приводит к разочарованию.

Если вы используете Visual Studio (не повезло!), У него также есть предупреждение для этого.Очевидно, это предупреждение уровня 4 , поэтому вам нужен переключатель /W4.У меня нет доступа к Visual Studio, поэтому, к сожалению, я не могу это проверить.

0 голосов
/ 01 марта 2019

Сначала у вас есть число

if (tmp = NULL)

, которое должно быть

if (tmp == NULL)

, иначе вы всегда сбрасываете tmp в NULL, и "if" никогда не вводится.

Во-вторых, в update () вы имеете дело с «root» вместо «tmp», правильное значение равно

    while (tmp != NULL)
    { 
        if (tmp->data % 2 == 0)
        {
            tmp->data = tmp->data / 2;
        }
        else
        {
            tmp->data = tmp->data * 2;
        }
        printf("\t%d", tmp->data);
        tmp = tmp->next;
    }

, так что на самом деле вы уже достаточно близки.пс .: первый вызов

createList((rand() % 10) + 1)

не требует аргументов

...