Oppure

Loading
19/05/12 11:35
splittik
Salve a tutti, premetto che sono nabbo da far schifo e dunque sarei molto grato a chi deciderà di aiutarmi ed inotre vi chiedo di NON postare codice ma piuttosto darmi delle indicazioni sui vari punti.

Per iniziare vorrei implementare min senza usare i metodi head e removes in quanto l'ho gia fatto ma il mio intento è rifarlo usando solo i puntatori.
In min credo di aver creato un puntatore al primo elemento della lista (che resterà fermo) e nel ciclo creo un nuovo puntatore al "nodo" successivo che mi servirà per fare i confronti.
In base ai confronti dell'if aggiorno il minimo e ritorno la parte intera del puntatore...ma quando stampo il valore mi scrive l'ultimo elemento che ho inserito.
Questo è il mio primo dubbio ringrazio anticipatamente chiunque voglia aiutarmi CIAO CIAO

Il testo è questo:
Modificare la libreria di gestione delle liste come segue:
1 aggiungere puntatore prev
2 scrivere funzioni min e max
3 scrivere funzione deletekey

//file liste.h
typedef struct elem {
	int key;
	struct elem *next;
	struct elem *prev;
} elemen_t;

typedef elemen_t* lista_t;



int is_empty(lista_t lista);

int length(lista_t lista);

lista_t insert(lista_t lista, int key);

int head(lista_t lista);

void removes(lista_t *plista); 

int max(lista_t lista);

int min(lista_t lista);

void delete_key(lista_t *lista, int key);






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


int is_empty(lista_t lista) {
	return(lista == NULL);
}


int length(lista_t lista) {
	int n = 0;
	while(lista != NULL) {
		n++;
		lista = lista->next;
	}
	return n;
}


lista_t insert(lista_t lista, int key) {
	elemen_t *paux;
	paux = (elemen_t *)malloc(sizeof(elemen_t));
	paux->key = key;
	paux->next = lista;
	return paux;
}


int head(lista_t lista) {
	if(lista != NULL) {
	return lista->key;
	}
	return 0;
}


void removes(lista_t *plista) {
	elemen_t *paux;
	if(*plista != NULL) {
		paux = *plista;
		*plista = (*plista)->next;
		free(paux);
	}
}


int min(lista_t lista){

	elemen_t *nodo=lista;
	int num=nodo->key;

	elemen_t *prox=lista;	
	int numn=prox->key;

	do{
		prox++;
		if(num>numn){
			num=numn;
			prox++;	
		}
		else{
			break;
		}


	}while(lista != NULL);
	
	return nodo->key;	

}


void delete_key(lista_t *plista, int key){
	//da implementare
}





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

void main(){

	int num;
	int i;
	int n;
	int testa;
	
	lista_t elm;
	lista_t elm1;
	lista_t elm2;
	elm=(struct elem*)malloc(sizeof(struct elem));
	elm1=(struct elem*)malloc(sizeof(struct elem));	
	elm2=(struct elem*)malloc(sizeof(struct elem));		

	printf("insesisci dimensione lista: ");
	scanf("%d", &num);

	for(i=0; i<num; i++){

		printf("insesisci num intero: ");
		scanf("%d", &n);
		
		elm =insert(elm, n);
		elm1 =insert(elm1, n);	
		elm2 =insert(elm2, n);	
	}
	int minimo=min(elm);
	printf("minimo %d\n", minimo);
	
	//int massimo=max(elm1);
	//printf("massimo %d\n", massimo);

	//delete_key(&elm2 , 5);

	free(elm);
	free(elm1);
	free(elm2);




aaa
19/05/12 23:16
pierotofy
?

Non puoi attraversare una lista usando solo i puntatori...

lista_t *curr = lista;
int min = MAX_INT;
while(curr != NULL){
   if (curr->key < min) min = curr->key;
   curr = curr->next;
}
return min;
Ultima modifica effettuata da pierotofy 19/05/12 23:17
Il mio blog: piero.dev
21/05/12 13:31
splittik
ciao boss

dunque al posto di
curr = curr->next;

è sbagliato usare
curr++;
perchè punterei in una parte sbagliata della struct??
aaa
21/05/12 14:01
pierotofy
Esatto.
Il mio blog: piero.dev