|
|||||||
|
|
|
![]() |
|
|
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 16: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: 08:04.




















