Парный обмен в связанном списке в C ++

Вы можете использовать следующий запрос для MYSQL:

SHOW columns FROM your-table;

Ниже приведен пример кода, который показывает, как реализовать выше синтаксис в php для перечисления имен столбцов:

$sql = "SHOW COLUMNS FROM your-table";
$result = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($result)){
    echo $row['Field']."
"; }

Подробнее о выходе SHOW COLUMNS FROM TABLE: MySQL Refrence.

-2
задан bruno 18 March 2019 в 18:41
поделиться

1 ответ

Как следует из названия функции, она обменивается данными в каждой паре ячеек (а не в самих ячейках).


Обмен данными из ячейки со следующей очень хорошо виден:

int tmp = head->next->data;
head->next->data = head->data;
head->data = tmp;

Как работает обратный вызов рекурсии?

вызов с pairWiseSwap(head->next->next); обходят пару ячеек, чьи данные были поменены местами для повторного выполнения на следующих.


Давайте рассмотрим пример с этим полным кодом:

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

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

void pairWiseSwap(struct node *head)
{
// The task is to complete this method
   if(!head || (head && head->next==NULL))
     return;

   if(head->next!=NULL)
   {
     int tmp = head->next->data;
     head->next->data = head->data;
     head->data = tmp;
     pairWiseSwap(head->next->next);
   }
}

struct node * mk(int d, struct node * nx)
{
  struct node * n = malloc(sizeof(struct node));

  if (n != NULL) {
    n->data = d;
    n->next = nx;
  }

  return n;
}

void pr(struct node * head)
{
  while (head) {
    printf("%d ", head->data);
    head = head->next;
  }
}

int main()
{
  struct node * head = mk(0, mk(1, mk(2, mk(3, mk(4, mk(5, NULL))))));

  printf("before : ");
  pr(head);

  pairWiseSwap(head);
  printf("\nafter:   ");
  pr(head);
  putchar('\n');

  /* free resources */
  while (head) {
    struct node * n = head->next;

    free(head);
    head = n;
  }
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra h.c
pi@raspberrypi:/tmp $ ./a.out
before : 0 1 2 3 4 5 
after:   1 0 3 2 5 4 

Примечание

if(!head || (head && head->next==NULL))
  return;

может быть просто

if ((head == NULL) || (head->next==NULL))
  return;

, потому что если головка не равна нулю в левой части ||, это бесполезная проверка, опять же, она не равна нулю в правой части

<час >

Если рекурсия выполняется на head->next, а не на head->next->next, функция выполняет своего рода вращение, и в результате получается 1 2 3 4 5 0

0
ответ дан bruno 18 March 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: