Lista bidirezionale

di il
2 risposte

Lista bidirezionale

Salve devo fare un programma dove creo una lista bidimensionale e poi la interrogo dandoli in input un numero e il programma mi deve restituire la posizione del nodo contenente il valore nel caso in cui il valore non c'è restituisce -1 e si chiude.
Il problema è che tutte le volte che trova il nodo il programma deve cambiare i nodi in modo che la lista sia in ordine crescente di volte che il nodo è stato cercato.
Io ho fatto così:
      #include <stdio.h>
#include <stdlib.h>

typedef struct nod{
	int info,cont;
	struct nod *next;
	struct nod *prev;
}nodo;

int main(){
	int i,n,v,t,c;
	scanf("%d",&n);
	if(n!=0){
		nodo *l=NULL;
		nodo *add=NULL;
		for (i=0;i<n;i++){
			nodo *temp=malloc(sizeof(nodo));
			scanf("%d",&v);
			temp->info=v;
			temp->cont=0;
			temp->next=NULL;
			if(l==NULL){
				temp->prev=NULL;
				l=temp;
			}
			if(add!=NULL){
				temp->prev=add;
				add->next=temp;
			}
			add=temp;
		}
		t=-1;
		while (t!=0){
			scanf("%d",&v);
			nodo *temp=l;
			c=0;
			t=-1;
			while(t!=1 && t!=0){
				if(temp->info==v){
					(temp->cont)++;
					nodo *occ=l;
					while((occ->cont)<(temp->cont) && occ->next!=NULL){
						occ=occ->next;
					}
					if(temp->next!=NULL || temp!=occ){
						if (temp->prev==NULL){
							temp->next->prev=NULL;
							l=temp->next;
						}else{
							temp->prev->next=temp->next;
							temp->next->prev=temp->prev;
						}
						if (occ->next==NULL && (occ->cont)<(temp->cont)){
							occ->next=temp;
							temp->prev=occ;
							temp->next=NULL;
						}else{
							occ->prev->next=temp;
							temp->next=occ;
							temp->prev=occ->prev;
							occ->prev=temp;
						}
					}
					t=1;
				}else{
					c++;
					temp=temp->next;
				}
				if (temp==NULL){
					t=0;
				}
			}
			if (t==1){
				printf("%d\n",c);
			}
		}
		printf("-1");
	}
	return 0;
}
        
Il programma sembra non riordinare i nodi e in più se provo a cercare un valore se il valore che cerco dopo sta in un nodo che è stato inserito dopo errore di segmentazione.
Mi è venuto un dubbio si può scrivere comandi del genere per manipolare i nodi precedenti: nodo->prec->next=tempo ?

2 Risposte

  • Re: Lista bidirezionale

    "bidirezionale" non bidimensionale ...

    Certo che puoi scrivere in quel modo ma devi fare molta attenzione perché uno dei puntatori potrebbe essere null.
  • Re: Lista bidirezionale

    Si scusa ho scritto da telefono
    Si all'inizio infatti pensavo che il problema poteva essere quello ma nel vodice che ho postato ho messo degli if a posta per evitare che appunto mi prendeva un puntatore nullo...solo che il problema persiste...potresti dare uno sguardo al codice e vedere se ci sono errori? non tanto sulla parte della creazione della lista ma sulla parte dello "scambia" perchè sinceramente io non lo riesco a trovare a livello logico mi sembra tutto giusto
Devi accedere o registrarti per scrivere nel forum
2 risposte