Как отсортировать структуру - PullRequest
1 голос
/ 03 августа 2020

У меня есть структура в C, которая выглядит так:

typedef struct node {
  int id;
  int salary;
  struct node *next;
  char name[30];
  char phone[10];
  char position[30];
} List;

У меня также есть два типа списка переменных, и я хочу отсортировать структуры по идентификатору (самый большой идентификатор будет последним). Моя идея, как решить эту проблему:

  1. Do ** указатель точки на * head (* head = указатель на первый член списка).
  2. Проверьте, больше ли ** pointer.id то ** pointer.next.id Если да -> ** pointer.next будет указывать на * pointer.next.next ** pointer.next.next будет указывать на & pointer

Вот код решение этой проблемы (потом сделаю «косметику» кода и алгоритм пузырьковой сортировки. Сначала просто хочу создать код, который будет работать):

void sort(List head) {
  int length = getListLength(head);
  List **currentNode = &head;

  for(int i = 0; i < length; i++) {
    **currentNode = &head;
    for(int j = 0; j < length; j++) {
      if(currentNode->id > currentNode->next->id) {
        currentNode->next = currentNode->next->next;
        currentNode->next->next = &currentNode;
      }
    }
  }
}

Есть ошибки:

         ^             ~~~~~
list.c:92:19: error: assigning to 'List' (aka 'struct node') from incompatible type 'List *' (aka 'struct node *'); remove &
    **currentNode = &head;
                  ^ ~~~~~
list.c:94:21: error: member reference base type 'List *' (aka 'struct node *') is not a structure or union
      if(currentNode->id > currentNode->next->id) {
         ~~~~~~~~~~~^ ~~
list.c:94:39: error: member reference base type 'List *' (aka 'struct node *') is not a structure or union
      if(currentNode->id > currentNode->next->id) {
                           ~~~~~~~~~~~^ ~~~~
list.c:95:20: error: member reference base type 'List *' (aka 'struct node *') is not a structure or union
        currentNode->next = currentNode->next->next;
        ~~~~~~~~~~~^ ~~~~
list.c:95:40: error: member reference base type 'List *' (aka 'struct node *') is not a structure or union
        currentNode->next = currentNode->next->next;
                            ~~~~~~~~~~~^ ~~~~
list.c:96:20: error: member reference base type 'List *' (aka 'struct node *') is not a structure or union
        currentNode->next->next = &currentNode;
        ~~~~~~~~~~~^ ~~~~

Пожалуйста, дайте мне способ исправить это (не решая проблему. Просто хочу знать, что не так в моем коде, а затем исправить это самостоятельно).

Основная функция:

int main() {
  List *head = (List *) malloc(sizeof(List));
  if(head == NULL) {
    return 1;
  }

  head -> id = 332513075;
  head -> salary = 1000;
  strcpy(head -> name, "Name Lastname");
  strcpy(head -> phone, "0587885238");
  strcpy(head -> position, "cleaner");

  head -> next = (List *) malloc(sizeof(List));

  head -> next->id = 2;
  head -> next->salary = 2000;
  strcpy(head -> next -> name, "Another name");
  strcpy(head -> next -> phone, "1234567890");
  strcpy(head -> next -> position, "CEO");
  head -> next -> next = NULL;

  sort(*head);
  print_list(*head);

  return 0;
}

Ответы [ 2 ]

1 голос
/ 03 августа 2020
  • Первая ошибка: head - это List, поэтому &head будет List*; но вы пытаетесь назначить его List**.

  • Остальные связаны с обработкой currentNode, как если бы это был List*.

Таким образом, объявление currentNode как List* решит перечисленные ошибки.

0 голосов
/ 04 августа 2020

Думаю, вам понадобятся следующие модификации:

  1. передать адрес головы, поскольку я полагаю, что функция сортировки должна обновить заголовок после сортировки и передать заголовок в print_list: sort (& head); print_list (head);

  2. алгоритм сортировки кажется неверным. Я не делюсь модификациями в алгоритме, но делюсь модификациями для удаления ошибки и обновления указателя заголовка:

    void sort (List ** head) {int length = getListLength (* head); Список * currentNode = * голова; // любезно реализуйте здесь Al go, используя currentNode как указатель на список * head = ...; // обновить указатель заголовка}

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