доступ к данным, выделенным указателем в структуре вопроса - PullRequest
0 голосов
/ 14 апреля 2020

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

* Проблема при втором вызове печати. ​​

Мой единственный вариант - сделать head = head-> next, чтобы получить следующие переменные? Структуры:

typedef struct
{
    int x;
    int y;
}point;

typedef struct {
    point *p;
    struct Item *next;
}Item;

Основная:

void main()
{   
    Item *head = (Item*)malloc(sizeof(Item)); //head of co-list
    if (!head) { //allocation check
        printf("Allocation failed (head)\n");
        exit(1);
    }
    head = addBegin(head);
    printf("head point: (%d,%d)\n",head->p->x,head->p->y);
    system("pause");
    head = addBegin(head);
    **printf("head second point: (%d,%d)\n",head->next->p->x,head->next->p->y);**
    system("pause");
    free(head->p);
    free(head);
}

Функция:

Item * addBegin(Item *head)
{
    Item *tmp = (Item*)
        malloc(sizeof(Item));
    if (tmp) {
        tmp->p = (point*)malloc(sizeof(point));
        printf("Enter x's point: ");
        scanf(" %d", &tmp->p->x);
        printf("Enter y's point: ");
        scanf(" %d", &tmp->p->y);
        tmp->next = head;
        return tmp;
    }
    else{        //memory allocation failed
        printf("allocation failed (new head)\n");
        exit(2);
        return head;
}

1 Ответ

0 голосов
/ 15 апреля 2020

Вы хотели бы пройтись по списку с кодом, похожим на:

for ( Item* current = &head;
      current != NULL;
      current = current->next ) {
  do_stuff_with(current->p);
}

Это останавливается, когда вы достигаете конца списка: то есть, когда вы обработали последний узел, содержащий данные, чей Указатель next имеет значение NULL и обновлен с current до NULL.

В примечании к стороне, вы хотите немного изменить определение Item, чтобы:

typedef struct Item {
    point *p;
    struct Item *next;
} Item;

Некоторые компиляторы, в том числе G CC, поймут, что Item.next имеет тот же тип, и перестанут выдавать вам ложные предупреждения об анонимных структурах и неполных типах.

он также может заплатить, чтобы решить, хотите ли вы хотите использовать Item и Point или item и point. Непоследовательная капитализация сбивает с толку.

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