Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Brisanje iz jednostruke liste!?

[es] :: C/C++ programiranje :: Brisanje iz jednostruke liste!?

[ Pregleda: 2998 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

BoLa
Software Developer
Sarajevo

Član broj: 7535
Poruke: 78
*.wifi-01.sa.lol.ba.



Profil

icon Brisanje iz jednostruke liste!?23.11.2004. u 10:08 - pre 236 meseci
Pozdrav,

pravim jednostruku listu. Sve je ok, ali ne mogu da napravim funkciju za brisanje elementa iz jednostruke liste. U biti, funkcija treba da radi sljedece:
void UkloniElemenat(JCVOR **pocetak,int id_elementa) - ukoni elemenat sa zadanim IDom. Znam da da trebam gledati sljedeci elemenat i zatim ako je on jedank trazenom IDu postaviti da pokazuje na sljedeci->sljedeci ali nikako ne mogu to da napravim a da se program ne obori. PLEASE HELP!

Evo sta sam do sada napisao: U funkciji UkloniElemenat znam da mora biti jos i specijalni slucaj ako ima samo jedan cvor, ali ne razumjem kako odraditi ovo kada ih ima vise.
Code:

typedef struct cvor
{
 int data;
 struct cvor *sljedeci;
} JCVOR;

JCVOR *glava = NULL;

void DodajElement(JCVOR **pocetak,int vrijednost);
void UkloniElemenat(JCVOR **pocetak,int id_elementa);

void main( void )
{
JCVOR *curr;
 DodajElement(&glava,10);
 DodajElement(&glava,20);
 DodajElement(&glava,30);
 
 for (curr = glava;curr!=NULL; curr=curr->sljedeci)
 {
  //printf("%d",curr->data);
 }
 UkloniElemenat(&glava,20);
}

void DodajElement(JCVOR **pocetak,int vrijednost)
{
 JCVOR *NoviCvor;

 if ( (NoviCvor = (JCVOR *)malloc( sizeof( JCVOR ) )) == NULL )
 {
  printf( "Neuspjela alokacija memorije! ");
 }
 else
 {
  NoviCvor->data = vrijednost;
  NoviCvor->sljedeci = *pocetak;
  *pocetak = NoviCvor;
 }
}
void UkloniElemenat(JCVOR **pocetak,int id_elementa)
{
 JCVOR *trenutni;

 for (trenutni = *pocetak; trenutni->sljedeci !=NULL; trenutni=trenutni->sljedeci)
 {
  if ( trenutni->sljedeci->data == id_elementa)
  {
    trenutni = trenutni->sljedeci->sljedeci;
    free(trenutni->sljedeci);
  }
  
 }
}
 


PLEASE HELP. Sve ostale potrebne funkcije sam nasao u odlicnim tutorialima, jedino mi ova fali. Imam Pop ali ona ne zadovoljava, jer brise samo sa pocetka stack-a.
 
Odgovor na temu

Marko Stankovic

Član broj: 11
Poruke: 306
*.rvkds.net.



Profil

icon Re: Brisanje iz jednostruke liste!?23.11.2004. u 11:47 - pre 236 meseci
Evo prepravio sam ti malo kod i dodao neke komentare da ti pomognu da malo bolje razumes ovo. Mozda je malo nejasno i mozda moze i malo bolje da se odradi ali nemam mnogo vremena pa je sve sklepano na brzaka. Ostavicu ti samo funkciju za uklanjanje:

Code:

void UkloniElemenat(JCVOR **pocetak,int id_elementa)
{
 JCVOR *trenutni, *pret=0; /*pret uvodim jer ce on da pokazuje uvek na
                          prethodni element trenutnom */
 for (trenutni = *pocetak; trenutni->sljedeci !=NULL; trenutni=trenutni->sljedeci)
 {
  if ( trenutni->data == id_elementa) 
  {
    if(trenutni==*pocetak) {  /*ovde ispitujemo da li se radi o prvom clanu */
        *pocetak=trenutni->sljedeci; /*ako jeste u tom slucaju treba da namestimo glavu na sledeci el. */
        free(trenutni); /* i oslobadjamo memoriju */
        trenutni=pret;
    }
    else{
    pret->sljedeci=trenutni->sljedeci; /*ovde sam premostio element koji izbacujem 
                                 da se lista ne bi prekinula */         
    free(trenutni);
    trenutni=pret; /* ovo je zato sto trenutni vise ne postoji i sada ga stavljam na prethodni
                     element zato sto ce na kraju for ciklusa on da izvrsi trenutni=trenutni->sled;*/
    }
  }
  pret=trenutni; /*i ovde naravno pomeramo pret na mesto trenutnog jer 
                   u sledecem prolazu trenutni se pomera unapred i pret ce opet pokazivati
                   prethodni element */
  if (trenutni==NULL) break; /* ovo se izvrsava samo ako postoji jedan cvor 
                                        i izlecemo samo da se ne bi izvrsilo trenutni=trenutni->sled 
                                       nije elegantno ali stvarno nemam vremena da napisem nesto bolje */
   
 }
}
 

I drink to make other people interesting.
 
Odgovor na temu

Alef
Viktor Kerkez
Novi Sad

Član broj: 505
Poruke: 188
*.ftn.ns.ac.yu.



Profil

icon Re: Brisanje iz jednostruke liste!?23.11.2004. u 12:11 - pre 236 meseci
Code:

void UkloniElemenat(JCVOR **pocetak,int id_elementa)
{
    if (*pocetak == NULL)
        return;
    else if ((*pocetak)->data == id_elementa) {
        JCVOR *tmp;
        tmp = *pocetak;
        *pocetak = (*pocetak)->sljedeci;
        free(tmp);
        return;
    }

    JCVOR *trenutni = (*pocetak)->sljedeci, *prethodni = *pocetak;
    for (; trenutni != NULL; trenutni = trenutni->sljedeci, prethodni = prethodni->sljedeci)
    if (trenutni->data == id_elementa) {
        prethodni->sljedeci = trenutni->sljedeci;
        free(trenutni);
    }
    return;
}


/* Uf, evo tek sad videh da sam preduhitren */

[Ovu poruku je menjao Alef dana 23.11.2004. u 13:38 GMT+1]
 
Odgovor na temu

ivbrcic
Ivan Brcic
Siemens
Zagreb

Član broj: 38567
Poruke: 35
*.siemens.at.



Profil

icon Re: Brisanje iz jednostruke liste!?23.11.2004. u 12:23 - pre 236 meseci
evo rjesenja:

Code:

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

typedef struct cvor
{
    int data;
    struct cvor *sljedeci;
} JCVOR;

void DodajElement(JCVOR **pocetak, int vrijednost)
{
    JCVOR *NoviCvor;
    if ( (NoviCvor = (JCVOR *)malloc( sizeof( JCVOR ) )) == NULL )
    {
        printf( "Neuspjela alokacija memorije! ");
    }
    else
    {
        NoviCvor->data = vrijednost;
        NoviCvor->sljedeci = *pocetak;
        *pocetak = NoviCvor;
    }
}

void UkloniElemenat(JCVOR **pocetak,int id_elementa)
{
    JCVOR *t0, *t1;
    
    if (*pocetak)
    {
        t0 = *pocetak;
        if (t0->data == id_elementa)
        {
            *pocetak = t0->sljedeci;
            free(t0);
        }
        else
            while (1)
            {
                t1 = t0->sljedeci;
                if (t1->data == id_elementa)
                {
                    t0->sljedeci = t1->sljedeci;
                    free(t1);
                    break;
                }
                t0 = t1;
            }
        
    }
}

int main(void)
{
    JCVOR *glava = NULL;
    JCVOR *curr;
    DodajElement(&glava,10);
    DodajElement(&glava,20);
    DodajElement(&glava,30);
    
    UkloniElemenat(&glava,30);
    UkloniElemenat(&glava,20);
    
    curr = glava;
    while (curr)
    {
        printf("%d\n", curr->data);
        curr = curr->sljedeci;
    }
    
    return 0;
}
 
Odgovor na temu

BoLa
Software Developer
Sarajevo

Član broj: 7535
Poruke: 78
*.wifi-01.sa.lol.ba.



Profil

icon Re: Brisanje iz jednostruke liste!?23.11.2004. u 14:36 - pre 236 meseci
E hvala ljudi, ne znate koliko ste mi pomogli! Svaka cast!

Uzdravlje
 
Odgovor na temu

[es] :: C/C++ programiranje :: Brisanje iz jednostruke liste!?

[ Pregleda: 2998 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.