PDA

View Full Version : [C] Liste bidirezionali


SteR9
17-02-2005, 16:10
ragazzi potreste farmi un esempio di liste bidirezionali?
nn capisco come mi devo comportare nel caso in cui sia il primo elemento, devo associargli null al puntatore all'elemento precedente?

anx721
17-02-2005, 16:27
Originariamente inviato da SteR9
devo associargli null al puntatore all'elemento precedente?

certo

SteR9
17-02-2005, 16:41
typedef struct nodoBi{
int numero;
struct nodoBi *pProx;
struct nodoBi *pPrec;
}nodoBi;

void inserisci_elementi(nodoBi **ppNodo,int elem);
void stampa_elem(nodoBi *pNodo,int contr);
int main()
{
nodoBi *pTesta;
pTesta = NULL;
inserisci_elementi(&pTesta,15);
inserisci_elementi(&pTesta,3);
inserisci_elementi(&pTesta,64);
inserisci_elementi(&pTesta,6);
inserisci_elementi(&pTesta,34);
stampa_elem(pTesta,2);
stampa_elem(pTesta,1);
system("PAUSE");
return 0;
}

void stampa_elem(nodoBi *pNodo,int contr){
nodoBi *Punt;
Punt = pNodo;
puts("*****************************************");
while(Punt != NULL){
switch (contr){
case 1:
if((Punt->pPrec != NULL) && (Punt->pProx!=NULL)){
printf("Precedente: %d || Corrente: %d || Successivo: %d\n",Punt->pPrec->numero,Punt->numero,Punt->pProx->numero);
}
break;
case 2:
printf("Numero: %d\n",Punt->numero);
break;
}
Punt=Punt->pProx;
}
}
void inserisci_elementi(nodoBi **ppNodo,int elem){

nodoBi *Punt,*pPreced,*pProxi;

pPreced = NULL;
pProxi = *ppNodo;
while((pProxi != NULL) && (pProxi->numero < elem)){
pPreced = pProxi;
pProxi = pProxi->pProx;
}
Punt = (nodoBi*)malloc(sizeof(nodoBi));
Punt->numero = elem;
Punt->pProx = pProxi;
Punt->pPrec = pPreced;

if(pPreced != NULL){
pPreced->pProx = Punt;
}else{
*ppNodo = Punt;
Punt->pPrec = NULL;
}
}


ho provato a fare così però se nn metto l'
if((Punt->pPrec != NULL) && (Punt->pProx!=NULL)){
da errore e esce.. cosa sbaglio?
ciao :)

SteR9
17-02-2005, 16:50
ho trovato un altro errore se l'elemento quando viene inserito capita in testa e poi viene spostato il suo valore rimarrà null..come risolvo?

SteR9
17-02-2005, 16:59
Originariamente inviato da SteR9
ho trovato un altro errore se l'elemento quando viene inserito capita in testa e poi viene spostato il suo valore rimarrà null..come risolvo?
ho provato facendo così nell'else

else{
(*ppNodo)->pPrec = *ppNodo;
*ppNodo = Punt;
Punt->pPrec = NULL;
}

ma non va..HELP! :muro: :)

Fenomeno85
17-02-2005, 17:31
#include <stdio.h>
#include <stdlib.h>

typedef struct EL {
int iVal;
struct EL *pNext;
struct EL *pPrec;
} Node;

void visualizza (Node *pEl){
if (pEl==NULL) return;
printf ("\nElement:\t%d",pEl->iVal);
visualizza(pEl->pNext);
}

void ins_head (Node **pTesta, int iValue){
Node *pApp;
pApp = (Node*)malloc(sizeof(Node));
pApp->iVal = iValue;
pApp->pNext = *pTesta;
pApp->pPrec = NULL;
*pTesta = pApp;
}

void ins_ord (Node **pTesta, int iValue){
Node *pApp, *pSup, *pPrec;
pApp = (Node*)malloc(sizeof(Node));
pApp->iVal = iValue;
pSup = *pTesta;
pPrec = NULL;
while (pSup!=NULL && pSup->iVal < pApp->iVal){
pPrec=pSup;
pSup=pSup->pNext;
}
if (pPrec == NULL){
pApp->pNext = pApp->pPrec = NULL;
*pTesta = pApp;
}
else{
pPrec->pNext = pApp;
pApp->pNext = pSup;
pApp->pPrec = pPrec;
if (pSup != NULL){
pSup->pPrec = pApp;
}
}
}

int main (void){
Node *Testa;
Node *TestaOrdinata;
TestaOrdinata = NULL;
Testa = NULL;
ins_head (&Testa,3);
ins_head (&Testa,4);
ins_head (&Testa,5);

ins_ord (&TestaOrdinata,3);
ins_ord (&TestaOrdinata,4);
ins_ord (&TestaOrdinata,5);


visualizza (Testa);
printf ("\n\n");
visualizza (TestaOrdinata);
printf ("\n\n");
system ("PAUSE");
return (0);
}


~§~ Sempre E Solo Lei ~§~

SteR9
17-02-2005, 18:15
mi perde il primo elemento così

void inserisci_elementi(nodoBi **ppNodo,int elem){

nodoBi *Punt,*pPreced,*pProxi;

pPreced = NULL;
pProxi = *ppNodo;
while((pProxi != NULL) && (pProxi->numero < elem)){
pPreced = pProxi;
pProxi = pProxi->pProx;
}
Punt = (nodoBi*)malloc(sizeof(nodoBi));
Punt->numero = elem;
Punt->pProx = pProxi;
Punt->pPrec = pPreced;

if (pPreced == NULL){
Punt->pProx = Punt->pPrec = NULL;
*ppNodo = Punt;
}
else{
pPreced->pProx = Punt;
Punt->pProx = pProxi;
Punt->pPrec = pPreced;
if (pProxi != NULL){
pProxi->pPrec = Punt;
}
}

}

Fenomeno85
17-02-2005, 18:33
scusa mi son dimenticato di postarti l'ultima versione che avevo fatto :muro:

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

typedef struct EL {
int iVal;
struct EL *pNext;
struct EL *pPrec;
} Node;

void visualizza (Node *pEl){
if (pEl==NULL) return;
printf ("\nElement:\t%d",pEl->iVal);
visualizza(pEl->pNext);
}

void ins_head (Node **pTesta, int iValue){
Node *pApp;
pApp = (Node*)malloc(sizeof(Node));
pApp->iVal = iValue;
pApp->pNext = *pTesta;
pApp->pPrec = NULL;
*pTesta = pApp;
}

void ins_ord (Node **pTesta, int iValue){
Node *pApp, *pSup, *pPrec;
pApp = (Node*)malloc(sizeof(Node));
pApp->iVal = iValue;
pSup = *pTesta;
pPrec = NULL;
while (pSup!=NULL && pSup->iVal < pApp->iVal){
pPrec=pSup;
pSup=pSup->pNext;
}
if (pPrec == NULL){
pApp->pNext = *pTesta;
pApp->pPrec = NULL;
*pTesta = pApp;
}
else{
pPrec->pNext = pApp;
pApp->pNext = pSup;
pApp->pPrec = pPrec;
if (pSup != NULL){
pSup->pPrec = pApp;
}
}
}

int main (void){
Node *Testa;
Node *TestaOrdinata;
TestaOrdinata = NULL;
Testa = NULL;
ins_head (&Testa,3);
ins_head (&Testa,4);
ins_head (&Testa,5);

ins_ord (&TestaOrdinata,3);
ins_ord (&TestaOrdinata,2);
ins_ord (&TestaOrdinata,4);
ins_ord (&TestaOrdinata,5);


visualizza (Testa);
printf ("\n\n");
visualizza (TestaOrdinata);
printf ("\n\n");
system ("PAUSE");
return (0);
}


~§~ Sempre E Solo Lei ~§~