gpt4 book ai didi

c - 如何在c中反转双向链表

转载 作者:行者123 更新时间:2023-11-30 16:27:33 26 4
gpt4 key购买 nike

如何反转这个双向链表?我已经尝试过,但没有任何结果,当我调用函数 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。

关于c - 如何在c中反转双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52692204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com