簡體   English   中英

如何在C中反向雙向鏈表

[英]How to reverse a doubly linked list in c

我如何扭轉這個雙向鏈表? 我已經嘗試過,但是沒有結果,當我調用函數Reverse() ,它將所有節點設置為NULL。

這是我對雙向鏈表的第一次嘗試,我不知道我是否在做正確的事情。 關於如何使其更好的任何建議?

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


struct Prova
{
  char nome[16];
  int id;
};

typedef struct Node {
  struct Prova struttura;
  struct Node * next;
  struct Node *prev;

}TNodo;
typedef TNodo* Nodo;



void NuovaPrenotazione(struct Prova  p, Nodo *pp)
{
  Nodo temp;

  temp = (Nodo)malloc(sizeof(struct Node));

  temp->struttura = p;
  temp->next = *pp;
  temp->prev = NULL;

  if(*pp != NULL)
  {
    (*pp)->prev = temp;
  }

  *pp = temp;

}

void LeggiPrenotazione(struct Prova * p)
{
  printf("\nNome Cliente:");
  scanf(" %s", p->nome);
  printf("\nID:");
  scanf(" %d", &p->id);
}


void VisualizzaPrenotazione(Nodo nodo)
{
  Nodo temp;
  while(nodo != NULL)
  {
    temp = nodo->prev;
    if(nodo->prev == NULL)
      {
        printf("Prev = NULL\n");
      }
    else
    {
    printf("Prev:%s %d\n", temp->struttura.nome, temp->struttura.id);
    }
    printf("Curr:%s %d\n", nodo->struttura.nome, nodo->struttura.id);
    nodo = nodo->next;
  }

}

void Reverse(Nodo * p)
{
  Nodo temp;
  while(*p != NULL)
  {
    temp = (*p)->prev;
    (*p)->prev = (*p)->next;
    (*p)->next = temp;
    *p = (*p)->next;
  }


}


int Menu()
{
  int scelta;

  printf("*** M E N U ***\n"
     "1 - Nuova prenotazione\n"
     "2 - Stampa prenotazioni\n"
   "3 - Reverse\n"
   "0 - Esci\n"
  "Scelta --> ");
  scanf(" %d", &scelta);

  return scelta;
}



int main()
{
  int scelta;
  struct Prova test;
Nodo lista = NULL;
  do {
    scelta = Menu();

    switch (scelta)
    {
      case 1:  LeggiPrenotazione(&test);
               NuovaPrenotazione(test, &lista);
      break;
      case 2: VisualizzaPrenotazione(lista); break;
      case 3: Reverse(&lista); break;
      default: scelta = 0;
    }

  } while (scelta != 0);

  return 0;
}

我會根據您的建議改善我的問題。 任何幫助,將不勝感激。

根據geeksforgeeks,這是反向鏈接列表的正確方法: https ://www.geeksforgeeks.org/reverse-a-doubly-linked-list/

void Reverse(Nodo * p)
{
  Nodo temp = NULL;

  while(*p != NULL)
  {
    temp = (*p)->prev;
    (*p)->prev = (*p)->next;
    (*p)->next = temp;
    *p = (*p)->prev;
  }

  if(temp != NULL)
  {
    *p = temp->prev;
  }

}

我們循環遍歷p(頭節點)直到它為NULL,然后將(* p)-> prev與(* p)-> next交換,然后* p等於(* p)-> prev。 最后,如果temp不等於NULL,我們將temp-> prev分配給* p。

反向雙向鏈表的唯一正確方法是修改迭代代碼,以便(取決於是否設置了“當前方向”標志)將使用“下一個”還是“最后一個”。

如果您實際上修改了雙向鏈表中的每個元素,那么您最好將緩存從CPU中取出並沖洗掉廁所。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM