1 Востаннє редагувалося nazarnazik (30.10.2019 09:58:18)

Тема: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

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

typedef struct Node {
    int data;
    struct Node* next;
} Node;

typedef struct List {
    Node* head;
    Node* tail;
} List;

//-----------------------------------------------------------------------------
List* push(List* list, int data) {
    Node* node = malloc (sizeof(Node));
    node->data = data;
    node->next = NULL;

    if (list->head == NULL) {
        list->head = list->tail = node;
    }
    else {
        list->tail->next = node;
        list->tail = node;
    }

    return list;
}
//-----------------------------------------------------------------------------
void print(const List* list) {
    const Node* node;
    for (node = list->head; node; node = node->next) {
        printf("%d ", node->data);
    }
    printf("\n");
}
//-----------------------------------------------------------------------------
List* shiftLeft(List* list) {
    if (list->head == list->tail) {
        return list;
    }

    Node* node = list->head;
    list->head = list->head->next;
    node->next = NULL;
    list->tail->next = node;
    list->tail = node;

    return list;
}
//-----------------------------------------------------------------------------
List* shiftRight(List* list) {
    if (list->head == list->tail) {
        return list;
    }

    Node* node;
    for (node = list->head; node->next != list->tail; node = node->next) { ; }

    node->next = NULL;
    list->tail->next = list->head;
    list->head = list->tail;
    list->tail = node;

    return list;
}
//-----------------------------------------------------------------------------
List* shiftLeftN(List* list, unsigned cnt) {
    while (cnt--) {
        shiftLeft(list);
    }
    return list;
}
//-----------------------------------------------------------------------------
List* shiftRightN(List* list, unsigned cnt) {
    while (cnt--) {
        shiftRight(list);
    }
    return list;
}
//-----------------------------------------------------------------------------

int main() {
    List list = { NULL, NULL };
    int i = 10;

    srand(time(NULL));
    while (i--) {
        push(&list, rand() % 100);
    }

    print(&list);
    print(shiftLeftN(&list, 3));
    print(shiftRightN(&list, 4));

    return 0;
}

2

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

Це ви пропонуєте нам вираховувати 17 рядок у купі цього кхм, тексту?

3

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

adziri написав:

Це ви пропонуєте нам вираховувати 17 рядок у купі цього кхм, тексту?

Ось в цій строці
Node* node = malloc(sizeof(Node));

4 Востаннє редагувалося koala (30.10.2019 10:17:11)

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

Якщо ви користуєтеся компілятором ну хоча б року так 1990-го, не кажу вже про пізніші, то він не лише показує місце, а ще й дає опис помилки. І там, швидше за все, мова йде про невідповідність типів - malloc повертає void *, а вам потрібен Node *. Тобто треба просто зробити перетворення:

Node* node = (Node *)malloc(sizeof(Node));

Якщо, звісно, я правильно зрозумів, що саме писав ваш компілятор.

Подякували: leofun011

5

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

koala написав:

Якщо ви користуєтеся компілятором ну хоча б року так 1990-го, не кажу вже про пізніші, то він не лише показує місце, а ще й дає опис помилки. І там, швидше за все, мова йде про невідповідність типів - malloc повертає void *, а вам потрібен Node *. Тобто треба просто зробити перетворення:

Node* node = (Node *)malloc(sizeof(Node));

Якщо, звісно, я правильно зрозумів, що саме писав ваш компілятор.

Так,все пішло,дякую))

6

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

Це дивлячись як компілювати.
Бо здається так ніби програму написано на С, а не на С++, ну, або на дуже поганому С++.
То ж, якщо код на С, то і компілюйте його як С.
Тоді цього приведення: (Node*)malloc(sizeof(Node));
робити не потрібно.

Подякували: 0xDADA11C7, leofun012

7 Востаннє редагувалося leofun01 (30.10.2019 14:13:00)

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

adziri написав:

... приведення: (Node*)malloc(sizeof(Node));
робити не потрібно.

?

А шо так можна було ?

8

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

leofun01 написав:
adziri написав:

... приведення: (Node*)malloc(sizeof(Node));
робити не потрібно.

?

А шо так можна було ?

C != C++
Якби банально це не звучало )

9

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

Мене бентежить інше:

typedef struct List {
    Node* head;
    Node* tail;
} List;

Ніде такого я ще не читав, щоби ім'я типу змінної було тотожно з іменем типу структури. Зазвичай кодять так:

typedef struct _List {
//...вміст
} List;

Студія сама не пропонує С, тому початківці кодять на С++, які в кращому випадку скомпілюються і в С.

10

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

Це поширена практика в C. Назви List та struct List не заважають одна одній. Підказка: це не назва змінної.

Подякували: leofun011

11

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

koala написав:

Підказка: це не назва змінної.

Всеж мадярська нотація майкрософта чомусь розділяє їх.

12 Востаннє редагувалося koala (30.10.2019 18:39:11)

Re: Не можу зрозуміти помилку в коді,компілятор знахадить її у 17 строці.

Бо в плюсах це буде таки зміннатотожне перевизначення.

Подякували: 0xDADA11C7, leofun012