|
|
|
![]() |
|
Strumenti |
![]() |
#1 | ||
Junior Member
Iscritto dal: Aug 2008
Messaggi: 10
|
[C] liste
ciao, ho da fare come esercizio una lista particolare
Quote:
per ogni elemento x di lInt, max punta all'elemento di lInt che contiene il valore massimo tra tutti gli elementi lInt che precedono l'elemento x, elemento x incluso. Quindi max del primo elemento di lInt punta all'elemento stesso; max del secondo elementodi lInt punta al più grande tra il primo e il secondo elemento di l'Int; max del terzo elemento di lInt punta al più grande tra il 1°, il 2° e il 3° elemento di lInt e così via. dopo aver dichiarato lint di tipo TLISTA e int vettInt[VETTINT] nel main ho provato a fare questa funzione Quote:
per quanto riguarda il campo next penso sia giusto ma col campo max non ho molte idee... |
||
![]() |
![]() |
![]() |
#2 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Occhio che ci sono diversi errori a partire dalla dichiarazione della struttura. Non va dichiarata così:
Codice:
typedef struct nd{ int val; int nd *next; int nd *max; }TLISTA; Codice:
typedef struct nd { int val; struct nd *next; struct nd *max; }TLISTA; Codice:
#include <stdio.h> #include <malloc.h> typedef struct nd { int val; struct nd *next; struct nd *max; }TLISTA; TLISTA* NewNode(int val) { TLISTA *n; n = (TLISTA*)malloc(sizeof(TLISTA)); if( !n ) return NULL; n->val = val; n->next = NULL; n->max = NULL; return n; } TLISTA* insertlista(TLISTA* first, int val) { TLISTA *n = first, *nuovo, *maxnode; if ( first == NULL ) { nuovo = NewNode(val); nuovo->max = nuovo; return nuovo; } n = first; maxnode = first->max; while( n->next != NULL ) { n = n->next; if ( n->val > maxnode->val ) maxnode = n; } nuovo = NewNode(val); n->next = nuovo; if ( val > maxnode->val ) maxnode = nuovo; nuovo->max = maxnode; return first; } void freelista(TLISTA* first) { TLISTA *n1 = first, *n2; while ( n1 != NULL ) { n2 = n1->next; free(n1); n1 = n2; } } void printlista(TLISTA *first) { TLISTA *n = first; while( n != NULL ) { printf("val -> %d, max -> %d\n", n->val, n->max->val); n = n->next; } } int main() { TLISTA* lint = NULL; int vettInt[10] = {5,8,3,2,1,21,55,89,144,13}; int k; for (k = 0; k < 10; k++) { lint = insertlista(lint, vettInt[k]); } printf("\n"); printlista(lint); printf("\n"); freelista(lint); return 0; } Quote:
Ultima modifica di Vincenzo1968 : 27-12-2008 alle 15:56. |
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
Ad ogni inserimento basterebbe confrontare il valore all'interno del nuovo nodo e il valore all'interno dell'ultimo nodo della lista o sbaglio?
Certo, senza un puntatore alla coda della lista te la devi scorrere tutta lo stesso, ma con il puntatore sarebbe un bel miglioramento ^^ |
![]() |
![]() |
![]() |
#4 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Codice:
#include <stdio.h> #include <malloc.h> typedef struct nd { int val; struct nd *next; struct nd *max; }TLISTA; typedef struct tagLista { TLISTA *first; TLISTA *last; } Lista; TLISTA* NewNode(int val) { TLISTA *n; n = (TLISTA*)malloc(sizeof(TLISTA)); if( !n ) { printf("Memoria insufficiente.\n"); return NULL; } n->val = val; n->next = NULL; n->max = NULL; return n; } void insertlista(Lista *lista, int val) { TLISTA *nuovo; if ( lista->first == NULL ) { nuovo = NewNode(val); nuovo->max = nuovo; lista->first = lista->last = nuovo; return; } nuovo = NewNode(val); if ( val > lista->last->val ) nuovo->max = nuovo; else nuovo->max = lista->last->max; lista->last->next = nuovo; lista->last = nuovo; } void freelista(Lista* lista) { TLISTA *n1 = lista->first, *n2; while ( n1 != NULL ) { n2 = n1->next; free(n1); n1 = n2; } } void printlista(Lista *lista) { TLISTA *n = lista->first; while( n != NULL ) { printf("val -> %d, max -> %d\n", n->val, n->max->val); n = n->next; } } int main() { Lista lint; int vettInt[10] = {5,8,3,2,1,21,55,89,144,13}; int k; for (k = 0; k < 10; k++) { insertlista(&lint, vettInt[k]); } printf("\n"); printlista(&lint); printf("\n"); freelista(&lint); return 0; } ![]() |
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
Esattamente quello che intendevo anche se temo che stiamo solo complicando la vita al thread starter
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:49.