Как я могу правильно использовать двойные указатели в этом случае? - PullRequest
1 голос
/ 09 октября 2019

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

this: **r = &(r->next),

this: **r = &(*r->next),

или это: **r = &(**r->next)

То же самое происходит, когда я пытаюсь изменить, куда указывает мой двойной указатель "a". Это полный метод на тот случай, если вам нужно его увидеть,

int sortBoardingQueue(BoardingQueue *qPtr){
    int size = calculateSize(qPtr);

    Passenger *t = qPtr->head;
    Passenger *a = qPtr->head->next;
    Passenger **r = &(qPtr->head);
    Passenger **q = &(qPtr->next);
    for (int i = size-1; i <=0; i--)
    {
        while(t != NULL){
            if (t->seatNumber>a->seatNumber)
            {
                **r = *a;
                **q = *t;
            }
            t = t->next;
            a = a->next;
            **r = &(r->next);
            **a = &(a->next);
        }
    }

}

//the declarations of the structs I am using in my header file
typedef struct boardingQueue {
    Passenger* head; // points to the Passenger at the front/head of the queue
    Passenger* tail; // points to the Passenger at the end/tail of the queue
} BoardingQueue;

typedef struct passenger {
char name[30];          // the passenger's name
double passportNumber;  // their passport number
int seatNumber;         // their seat number on the plane
struct passenger* next; // a pointer to the next passenger in the queue after this one
} Passenger;

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

- в следующий раз будет легче получить ответ, если фрагмент размещенного кода будет именно тем, что вы вводите в компилятор, и если вы включите ошибки вашего компилятора в точности так, как они появляются вместе с вашимвопрос.

Я реструктурировал ваш пример кода + добавил основную функцию, чтобы показать некоторые ошибки компилятора, чтобы показать, что я имею в виду:


Пример кода

#define NULL 0
//the declarations of the structs I am using in my header file
typedef struct passenger {
char name[30];          // the passenger's name
double passportNumber;  // their passport number
int seatNumber;         // their seat number on the plane
struct passenger* next; // a pointer to the next passenger in the queue after this one
} Passenger;

typedef struct boardingQueue {
    Passenger* head; // points to the Passenger at the front/head of the queue
    Passenger* tail; // points to the Passenger at the end/tail of the queue
} BoardingQueue;

int sortBoardingQueue(BoardingQueue *qPtr){
    int size = 3; // func undefined?? calculateSize(qPtr);

    Passenger *t = qPtr->head;
    Passenger *a = qPtr->head->next;
    Passenger **r = &(qPtr->head);
    Passenger **q = &(qPtr->next);
    for (int i = size-1; i <=0; i--)
    {   
        while(t != NULL){
            if (t->seatNumber>a->seatNumber)
            {
                **r = *a; 
                **q = *t; 
            }
            t = t->next;
            a = a->next;
            **r = &(r->next);
            **a = &(a->next);
        }
    }   

}

int main(){
    // make passengers
    Passenger a = {"p1", 111.0, 1, NULL};
    Passenger b = {"p2", 222.0, 2, NULL};
    Passenger c = {"p2", 222.0, 3, NULL};

    // make boarding queue a->c->b
    a.next = &c; 
    c.next = &b; 
    BoardingQueue q = {&a, &b};

    sortBoardingQueue(&q);
}

Ошибки компилятора

dp.c: в функции 'sortBoardingQueue': dp.c: 22: 27: ошибка: в BoardingQueue {aka struct boardingQueue} 'нет члена с именем' next 'Passenger **q = &(qPtr->next);

Из этого, потому что boardingQueue не имеет члена next, только head и tail. (Может быть, вы хотели, чтобы это указывало на пассажира? Я не могу сказать, что вы намеревались из контекста)

dp.c:33:22: error: request for member ‘next’ in something not a structure or union
              `**r = &(r->next);`

Для этого r имеет тип Passenger **, поэтому он указывает на структуру пассажира,Если вы действительно хотите получить доступ к следующему полю этой структуры, вам придется использовать (*r)->next

  dp.c:34:13: error: invalid type argument of unary ‘*’ (have
 ‘Passenger {aka struct passenger}’)
              **a = &(a->next);

. Для этого a - это единственный указатель. Вы можете разыменовать его только один раз.


Итак, я надеюсь, что это поможет вам в этом задании! И в следующий раз, если вы опубликуете минимальный воспроизводимый пример https://stackoverflow.com/help/minimal-reproducible-example, вы обязательно получите лучшие ответы быстрее.

0 голосов
/ 09 октября 2019

Если указатель r объявлен и инициализирован следующим образом

Passenger **r = &(qPtr->head);

, то в этом выражении

**r = &(r->next);

**r имеет тип Passenger. Более того, г указывает на указатель. S это выражение r->next неверно, потому что указатели не имеют следующего элемента данных (указатели не являются структурами).

Таким образом, все три выражения

**r = &(r->next),

**r = &(*r->next),

**r = &(**r->next)

неверны. Например, выражение

&(**r->next)

эквивалентно

&(** ( r->next ) )

. Кажется, вы имеете в виду следующее

r = &( *r )->next;

Примите во внимание, что это объявление

Passenger **q = &(qPtr->next);

также недопустимо, поскольку структура BoardingQueue не имеет элемента данных next.

, а также условие в цикле for

for (int i = size-1; i <=0; i--)

недопустимо,Он будет действителен только в том случае, если size меньше или равно 1.:)

Необходимо переписать функцию sortBoardingQueue заново хотя бы с использованием допустимых выражений C. После этого вы можете задать вопрос: почему не работает моя функция сортировки ?:)

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