DOMANDA Come posso eliminare una serie di nodi in liste concatenate in C ?

m3tt0

Nuovo Utente
112
13
CPU
i5-9400F
Dissipatore
NZXT Kraken M22 120mm
Scheda Madre
ASRock H310CM-HDV
HDD
WDC 1TB & SSD 480GB
RAM
G.Skill F4-2400C17-8GIS DDR4
GPU
NVIDIA GeForce GTX 1660 Super
PSU
Cooler Master MWE 600W
Case
Antec NX210
Net
Fibra/Rame 100 mega
Ciao ragazzi, mi sto scervellando nel cercare una soluzione a questo problema. In pratica la consegna di questa esercitazione chiedeva di leggere una lista da un file, metterla in una struttura dati adeguata ( lista concatenata ), e poi eliminare dalla lista tutte le occorrenze minori di 300, poi vabbe ristamparle su file in ordine decrescente, il mio problema ora è eliminare queste benedette occorrenze, ho scritto il seguente codice con l'intento di assegnare ad ogni precedente nodo quello successivo all'occorrenza minore di 300, solo che ogni volta che trova un occorrenza maggiore di 300 si blocca giustamente, non riesco ad andare avanti, qualche consiglio su come fare?
Vi fornisco la funzione e il file da cui leggere, così che vi rendiate conto.
C:
struct azienda
{
    char NomeAzienda[DIM];
    int dipendenti;
    int dipartimenti;
    int sedi;   
    struct azienda* next;
};
typedef struct azienda node;

struct azienda *eliminate_node(node** head, int min_limit)
{
    
    while((*head) != NULL )
    {
        if (((*head) -> dipendenti) < min_limit)
        {
        node* tmp = (*head) -> next;
        free((*head));
        (*head) = tmp;           
        }

    }

    return (*head);
}


Questo invece è il file di testo:
Ubuntu 230 27 4
Fedora 580 22 16
Manjaro 410 24 12
Mint 320 17 8
Antergos 470 28 13
Arch 290 21 7
CentOS 440 33 12
Kali 240 35 5
 

bigendian

Utente Attivo
749
432
OS
Linux
Intanto, dovresti traversare l'intera lista, cosa che non fai perche resti sull ostesso elemento.
 

m3tt0

Nuovo Utente
112
13
CPU
i5-9400F
Dissipatore
NZXT Kraken M22 120mm
Scheda Madre
ASRock H310CM-HDV
HDD
WDC 1TB & SSD 480GB
RAM
G.Skill F4-2400C17-8GIS DDR4
GPU
NVIDIA GeForce GTX 1660 Super
PSU
Cooler Master MWE 600W
Case
Antec NX210
Net
Fibra/Rame 100 mega
Intanto, dovresti traversare l'intera lista, cosa che non fai perche resti sull ostesso elemento.
sisi vabbe l’ho già fatto, non ho riportato tutto il codice per non confondere troppo magari, ho già letto dal file e messo il tutto in una lista apposita, e quello va benissimo, riesco anche a stamparla su file correttamente se non eseguo l’eliminazione.
 

Andretti60

Utente Èlite
6,440
5,091
Sbagli la eliminazione.
In una lista concatenata, per eliminare un elemento devi cambiare il valore next dell’elemento precedente, e farlo puntare al valore di next del elemento che cancelli. Dopodiché puoi liberare la memoria associata. Quindi hai bisogno di una variabile in più, dove memorizzi l’elemento precedente.
 
  • Mi piace
Reazioni: Ibernato e m3tt0

m3tt0

Nuovo Utente
112
13
CPU
i5-9400F
Dissipatore
NZXT Kraken M22 120mm
Scheda Madre
ASRock H310CM-HDV
HDD
WDC 1TB & SSD 480GB
RAM
G.Skill F4-2400C17-8GIS DDR4
GPU
NVIDIA GeForce GTX 1660 Super
PSU
Cooler Master MWE 600W
Case
Antec NX210
Net
Fibra/Rame 100 mega
eh ma ci ho provato anche così, ma non sono riuscito a pensare per bene a come fare, perché effettivamente pensavo che per eliminare un elemento bastava deallocare il puntatore della testa e mettergli quello successivo all’occorrenza minore di 300, però non sono riuscito a capire come fare per i successivi all’occorrenza, non venivano salvati.
 

m3tt0

Nuovo Utente
112
13
CPU
i5-9400F
Dissipatore
NZXT Kraken M22 120mm
Scheda Madre
ASRock H310CM-HDV
HDD
WDC 1TB & SSD 480GB
RAM
G.Skill F4-2400C17-8GIS DDR4
GPU
NVIDIA GeForce GTX 1660 Super
PSU
Cooler Master MWE 600W
Case
Antec NX210
Net
Fibra/Rame 100 mega
Se ci hai provato pubblica il codice (come previsto da regolamento)
adesso provo a riscrivere quel codice così da mandarlo, nel frattempo però pensavo, non dovrei fare un caso a parte per il primo nodo della lista ? E poi come dovrei gestire nel caso non entrasse nell' if ?
 

bigendian

Utente Attivo
749
432
OS
Linux
ci sono 4 tipi di liste concatenate

- semplici
- bidirezionali
- circolari semplici
- circolari bidirezionali

mi pare tu stia usando la prima, per fortuna :)

Disegnati su un foglio gli elementi, e vedi di capire come scrivere la tua delete_nodo(), partirai dal primo elemento (o coda, che sara' noto) per arrivare alla testam che banalmente ha next a 0.
 
  • Mi piace
Reazioni: Andretti60

m3tt0

Nuovo Utente
112
13
CPU
i5-9400F
Dissipatore
NZXT Kraken M22 120mm
Scheda Madre
ASRock H310CM-HDV
HDD
WDC 1TB & SSD 480GB
RAM
G.Skill F4-2400C17-8GIS DDR4
GPU
NVIDIA GeForce GTX 1660 Super
PSU
Cooler Master MWE 600W
Case
Antec NX210
Net
Fibra/Rame 100 mega
ci sono 4 tipi di liste concatenate

- semplici
- bidirezionali
- circolari semplici
- circolari bidirezionali

mi pare tu stia usando la prima, per fortuna :)

Disegnati su un foglio gli elementi, e vedi di capire come scrivere la tua delete_nodo(), partirai dal primo elemento (o coda, che sara' noto) per arrivare alla testam che banalmente ha next a 0.
io ho usato un inserimento in coda nella lista, quindi il mio primo elemento è la testa della lista, dovrei quindi andare al ritroso ?
 

Andretti60

Utente Èlite
6,440
5,091
Non puoi andare a ritroso in una lista concatenata semplice in quanto hai solo l’indirizzo dell’elemento successivo.
Si, il primo elemento è un caso particolare, lo riconosci perché la variabile usata per memorizzare l’elemento precedente ha il valore nullo.
 

bigendian

Utente Attivo
749
432
OS
Linux
come nomini e' soggettivo, io lavoro con coda e testa dove aggiungo elementi, ricordandomi un serpente. Une se vuole puo nominare al contrario, anzi forse piu corretto aggiungere in coda. come ti piace, anche inizio e fine.
 

m3tt0

Nuovo Utente
112
13
CPU
i5-9400F
Dissipatore
NZXT Kraken M22 120mm
Scheda Madre
ASRock H310CM-HDV
HDD
WDC 1TB & SSD 480GB
RAM
G.Skill F4-2400C17-8GIS DDR4
GPU
NVIDIA GeForce GTX 1660 Super
PSU
Cooler Master MWE 600W
Case
Antec NX210
Net
Fibra/Rame 100 mega
vabbe io non vado al ritroso, vado dalla testa alla fine della lista, quindi la coda, e nel caso della testa dovrei fare un caso particolare, sto provando a disegnare, nel mentre ho scritto questo codice.
C:
struct azienda *eliminate_record(node** head, int min_limit)
{
    node *corrente = (*head);

    if ((corrente -> dipendenti) < min_limit)
        {
            node* tmp = corrente -> next;
            free((*head));
            (*head) = tmp;   
            corrente = corrente -> next;
        }
        
    while(corrente != NULL )
    {
        if ((corrente -> dipendenti) < min_limit)
        {
            node* tmp = corrente -> next;
            corrente -> next = tmp;   
            corrente = corrente -> next;
        }
        else
        {
            corrente = corrente -> next;
        }

    }

    return (*head);
}
 

bigendian

Utente Attivo
749
432
OS
Linux
Non mi pare un buon codice, ne funzionante.

io traverserei tutta la lista, chiamando una funziona delete_node sul nodo che deve essere simosso.
 

m3tt0

Nuovo Utente
112
13
CPU
i5-9400F
Dissipatore
NZXT Kraken M22 120mm
Scheda Madre
ASRock H310CM-HDV
HDD
WDC 1TB & SSD 480GB
RAM
G.Skill F4-2400C17-8GIS DDR4
GPU
NVIDIA GeForce GTX 1660 Super
PSU
Cooler Master MWE 600W
Case
Antec NX210
Net
Fibra/Rame 100 mega
Non mi pare un buon codice, ne funzionante.

io traverserei tutta la lista, chiamando una funziona delete_node sul nodo che deve essere simosso.
si so bene che non funziona, non riesco a fare di meglio per ora. questa funzione che dici di usare la potrei fare come una semplice deallocate, quindi fare una free e deallocare quel nodo ?
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!