Toon posts:

[c] linked list laatste element verwijderen

Pagina: 1
Acties:

Verwijderd

Topicstarter
hallow,

ik heb een probleemje met een linked list in c. ik gebruik de hieronderstaande code om een struct uit de list te verwijderen indien de waarde Beam van deze gelijk is aan B. Ik kan alle structs uit de linked list verwijderen, behalve de laatste, wie kan mij helpen?

alvast bedankt

code:
1
2
3
4
5
6
7
8
9
10
11
Node * previous;
Node * current;

for (previous = &(list->head); (current = previous->next) != NULL;
  previous = current) {
    if (current->Beam == B) {  
      previous->next = current->next;
        free(current);
          return 1;
    }
}

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Er gaat sowieso al iets mis omdat je het 1e element altijd skipped. En verder vind ik je code echt slecht om te lezen. Ik weet niet of je die stijl al lang hanteerd, maar het is onnodig gecompliceerd.

Verwijderd

Topicstarter
euhm... als ik hem run en ik verwijder het eerste element doet hij dit gewoon. probeer ut anders zelf eens, of heb je dat al gedaan?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik ga dit soort code niet uitproberen. Code schrijven kun je niet een trial en error manier doen, je moet inzien wat je aan het doen bent.

tip: verander previous in current, en current in next.

Verwijderd

Topicstarter
owkeej, is gebeurd, maareh, kan iemand anders mij dan misschien verder helpen ???

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik denk niet dat dit de bedoeling is. Probeer zelf nou eerst eens in te zien wat je aan het doen bent. Als dit een interessante vraag was, gaan mensen graag met je in discussie, maar dit is echt even goed zelf nadenken. Maak die code daarom eerst een stuk duidelijker, want dit is niets.

nog een tip:
teken het op papier uit. Dan zie je wat je aan het doen bent.

Verwijderd

Topicstarter
goed, dan leg ik ff uit wat ik doe:

ik loop de linked list door. ik onthoud steeds de vorige en de huidige struct uit de list. als de huidige verwijderd moet worden (in de hierbovenstaande code current->Beam==B) krijgt dus eerst de pointer van de vorige de waarde van de Next (dus de pointer naar de struct achter de huidige) van de huidige. er wordt dus nergens meer gewezen naar de huidige struct, en free ik deze. klinkt logisch, toch ??

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Maar als jij begint, spring je eigelijk automatisch al naar het 2e element in die lijst (die current stel je in als de previous->next, en de previous->next die stond op het 1e element). Daar gaat dus al iets fout.

Verwijderd

Topicstarter
tja, ik vind het zelf ook een beetje wazig, maar omdat hij het meteen deed op de eerste heb ik het maar laten staan. ik ga eens kijken voor misschien een wat 'makkelijkere' for-lus, iemand die in de tussentijd nog iets nuttigs hierover te zeggen heeft, graag...

avb

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik zou gaan voor een while lus om het wat makkelijker te maken. En verder moet je toekenningen in een expressie eigelijk niet doen (zijn k*t om te lezen). Vooral als je begint is duidelijkheid #1

Verwijderd

Topicstarter
goed, ik heb de for-lus vervangen door een while-lus, maar nog steeds hetzelfde probleem, hier komt de nieuwe code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  previous=pF->pBeam;
  current=pF->pBeam;
  count=0;
  while(current->Next!=NULL)
  {
     if(current->Beam==B)
     {
        previous->Next=current->Next;
        free(current);
        return 1;
     }
     if(count!=0)
        previous=current;
     current=current->Next;
     count++;
  }
  return 0;

Verwijderd

code:
1
2
3
4
5
6
if (current->next->Beam == B) 
{  
     current->next = current->next->next;
     free(current->next);
     return 1;
}


That shall do the trick

[ Voor 0% gewijzigd door Verwijderd op 05-11-2002 23:18 . Reden: een klein dingetje vergeten :) (current->next->Beam) ]


Verwijderd

En trouwens... je titel zegt dat je de laatste wilt verwijderen.... maar wat je nu aan het proberen bent is eentje uit het midden te verwijderen.

Verwijderd

Topicstarter
ik bedoelde ermee dat het met de laatste fout ging, was niet zo duidelijk...

Verwijderd

Deze heb ik net ook in andere C-linked list topic gezet.... is een animatie... kan je kijken hoe het moet :)

http://colos1.fri.uni-lj....LISTS/LINKEU/indexEU.html

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verwijderd schreef op 05 november 2002 @ 23:15:
goed, ik heb de for-lus vervangen door een while-lus, maar nog steeds hetzelfde probleem, hier komt de nieuwe code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  previous=pF->pBeam;
  current=pF->pBeam;
  count=0;
  while(current->Next!=NULL)
  {
     if(current->Beam==B)
     {
        previous->Next=current->Next;
        free(current);
        return 1;
     }
     if(count!=0)
        previous=current;
     current=current->Next;
     count++;
  }
  return 0;
Stel nu dat er 1 element in je lijst zit (en je current->next is dus null), dan ga je dat element weer skippen. Het komt er weer op neer, dat je gewoon een hekel hebt aan het laatste element :) Verder is de code al wel wat leesbaarder, maar er kan zeker nog wel iets aan gebeuren.

Probeer het nu eens op papier uit te tekenen en behandel hierbij de volgende voorbeelden:
lege lijst
lijst met 1 element
lijst met 5 elementen.

Probeer te tekenen wat er dan gebeurt. Code is een voortvloeisel van iets dat je kan visualiseren. Maar als je iets niet gegrijpt moet je code niet gaan gebruiken als hulpmiddel om iets te visualiseren. Vooral in dit prille stadium is dat echt een drama :)

[edit]
Bij refactoren (gestructeerd herschrijven van code) worden ook functie gebruik aangeraden om het wat duidelijker te maken. In jouw geval zou de functie laatsteElement wat zijn die een bool terug stuurt op basis van zo`n node.

je krijgt dan zoiets:

while(!isLaatste(...)){
}

dat is echt stukken leesbaarder..

Ik zou hier trouwens wel weer een lading c(++) programmeurs mee op mijn dak krijgen ;)

Verwijderd

Topicstarter
jow, ik heb hem al aant werken van de site die dj_delta net gaf, daar staat errug duidelijk hoe het moet/kan. bedankt voor je hulp.

Verwijderd

Topicstarter
even voor de goede orde: het moet while(current) zijn ipv while(current->Next!=NULL), anders komt de loop niet verder dan het een-na-laatste element in de list.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Alarmnummer schreef op 05 november 2002 @ 23:53:
Ik zou hier trouwens wel weer een lading c(++) programmeurs mee op mijn dak krijgen ;)
Ik hou m'n mond omdat je netjes al het probleem hebt opgelost voordat wij C(++) programmeurs het topic gespot hadden.

O-)

Professionele website nodig?

Pagina: 1