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 ?