PDA

Visualizza la versione completa : [C] Aiuto esami in vista! Programmino in C!


Poker32
07-09-2001, 12:59
Allora, l'estate è finita e ricomincia l'università! Quindi esami, problemi, stress, ecc... E l'ultima volta mi hanno bocciato in programmazione C.
Ora... il mio problema è l'uso dei puntatori e delle liste dinamiche! Io provo, provo, ma non riesce molto.
Mi potete dare una mano a risolvere questo problema, ed evitare un'altra figura di merda con il prof.?
Ad esempio, vi lascio il testo di un esercizio che dovevo svolgere:

Date due liste dinamiche, ordinate in maniera crescente, creare una funzione C che fonda le due liste in un'unica lista ordinata.(Operazione di MERGE).

Se volete aiutarmi, postatemi il codice per farlo, megli se ci mettete dentro anche qualche commento.

Lo so che è una rottura di palle, ma se non avete niente da fare, o siete molto buoni...

Vi ringrazio...
Ciao, Poker32

Andrea Simonassi
07-09-2001, 13:51
Ma frequenti mica il disi di Genova?

Poker32
07-09-2001, 16:17
no, no. sono di un'altra zona.
come mi puoi aiutare a risolvere questo problema?

Gohan!!!it'me!!!
07-09-2001, 16:28
Ti do 1 implementazione veloce e semplice ke puoi cmq ottimizzare.
Le liste sono ordinate in ordine decrescente e nn ci sono doppioni.

ciao
--------------------------------
strucn Node {
struct Node* previous;
struct Node* next;
int item;
}

struct List {
struct Node* first;
struct Node* last;
int number;
}

struct List* merge (struct List* L1ptr, struct List* L2ptr)
{
struct Node* NofL1ptr = L1ptr->first;
struct Node* NofL2ptr = L2ptr->first;
struct Node* temp;
if (NofL1ptr == NULL) {
free (L1ptr);
return L2ptr;
}
if (NofL2ptr == NULL) {
free (L2ptr);
return L1ptr;
}
for ( ;NofL1ptr != NULL; NofL1ptr = NofL1ptr->next)
//INIZIO FOR
while (NofL2ptr != NULL) {
//INIZIO WHILE
temp =NofL2ptr->next;
if ((Nofl2ptr->item) > (NofL1ptr->item)) {
NofL2ptr->previous = NofL1ptr->previous;
NofL2ptr->next = NofL1ptr;
NofL1ptr->previous =NofL2ptr;
NofL2ptr =temp;
if (NofL1ptr == L1ptr->first) L1ptr->first = NofL2ptr;
L1ptr->number++;
L2ptr->number--;
} else if (Nofl2ptr->item == NofL1ptr->item) {
free (NofL2ptr);
NofL2ptr=temp;
L2ptr->number--;
break;
} else {
NofL2ptr = temp;
break;
}
}
//FINE WHILE
//FINE FOR
if (NofL2ptr != NULL) {
L1ptr->last->next =NofL2ptr;
NofL2ptr->previous = L1ptr->last;
L1ptr->number += L2ptr->number;
L1ptr->last =L2ptr->last;
}
free (l2ptr);
return L1ptr;
}
//THE END


[Messaggio modificato da Gohan!!!it'me!!! il 07-09-2001 alle 04:57 PM]

Poker32
07-09-2001, 16:43
Io ti ringrazio Gohan, ma a prima vista non ho capito proprio niente. ci sono un casino di var. e di punt.
Solitamente i programmi che creo, e che vedo sul mio libro,sono molto più sintetici e molto più comprensibili(senza offesa, naturalmente).
Perchè?????
Esempio:
Un prog. che inserisce gli elementi in ordine in una lista

struct el {tipo info;
struct el *prox;
}
typedef struct el elemlista;
typedef elemlista *listaelem;
void Inserisci(listaelem *lista, tipo elem)
{
elemlista *punt, *puntcorr, *puntprec;
puntprec=null;
puntcorr=*lista;
while(puntcorr!=null && elem>puntcorr->info)
{
puntprec=puntcorr;
puntcorr=puntcorr->prox;
}
punt=malloc(sizeof(elemlista));
punt->info=elem;
punt->prox=puntcorr;
if(puntprec)!=null
puntprec->prox=punt;
else
*lista=punt;


mi puoi commentare il tuo, e mi chiarisci qualche cosa?

JamesD
23-09-2002, 19:07
Ho appena visto le liste e ho provato a fare un merge (che ovviamente non farà a caso tuo) ma in ogni caso prova a guardare se ti può servire...


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

typedef struct cella * LIST;

struct cella{
int cont;
LIST next;
};

void inser_ordinato (int x, LIST * punLL);
void print (LIST LL);

void main(){
LIST L1=NULL, L2=NULL;
int val=0;

while(true){
printf("\nInserisci un valore nella 1a lista. 10000 per uscire\n");
scanf("%d", &val);
if (val==10000) break;
inser_ordinato(val, &L1);
}

while(true){
printf("\nInserisci un valore nella 2a lista. 10000 per uscire\n");
scanf("%d", &val);
if (val==10000) break;
inser_ordinato(val, &L2);
}

//faccio il merge delle liste passando alla funzione inserimento ordinato L1 com lista
//e L2->cont come valore
while(L2 != NULL){
inser_ordinato(L2->cont, &L1);
L2=L2->next;
}

print(L1);
}

void inser_ordinato (int x, LIST * punLL){
LIST prec=NULL, succ=NULL;
LIST aux;

aux = (LIST) calloc (1, sizeof (struct cella));
aux->cont = x;

if((* punLL == NULL) || x < (* punLL)->cont){
aux->next = * punLL;
* punLL = aux;
}
else{
prec = * punLL;
succ = (* punLL)->next;
while((succ != NULL) && (succ->cont < x)){
succ = succ->next;
prec = prec->next;
}
aux->next = succ;
prec->next = aux;
}
}

void print (LIST LL){

printf("\nLista:\n");
while (LL != NULL){
printf("%d ", LL->cont);
LL = LL->next;
}
printf ("\n");
}

degno
23-09-2002, 19:20
Ciao, non è che studi a Perugia?

Poker32
23-09-2002, 23:42
ciao ragazzi.
mi fa piacere ricevere le vostre risposte, ma diciamo che siete arrivati un pò in ritardo.

questo post è di più di un anno fà.
adesso ho risolto tutti i problemi, e per dirla tutta, ho passato sia l'esame di c che quello di c++.
direi che adesso me la cavo molto bene sia con il c che con il c++.

cmq grazie per avermi risposto, alla prossima...

ciao, Poker32!

xxxAlex83xxx
24-09-2002, 00:13
hihihi!!:quote:

JamesD
24-09-2002, 20:24
:master: :master:

Ehm scusate mea culpa... :biifu:

Ho fatto una ricerca e m'era spuntato sto post e io ho risp senza badare alla data....:gren: :gren:


Colpa dell'alcoolismo giovanile...:sbav:

Loading