[C] lineaire lijst sorteren

Pagina: 1
Acties:

  • rrrrob
  • Registratie: December 2003
  • Laatst online: 27-05 07:39
Ik ben aan het oefenen voor mijn c-examen voor a.s. maandag.
Nu heb ik hier thuis ff geen c compiler voor handen en ik wil toch graag weten of ik het goed doe. Dus als jullie even naar deze opgave en mijn antwoord zouden willen kijken...........

Dit is dus de opgave uit een oefententamen:

Schrijf een functie die van een lineairelijst met integers nagaat of deze gesorteerd is van klein naar groot.

gebruik onderstaand datatype:

code:
1
2
3
4
5
typedef struct _node 
{ 
    struct _node *next; 
    int w; 
}  El, *pEl;


mijn oplossing:

code:
1
2
3
4
5
6
7
bool Sorted (pEl L) 
//pre: L is een lineaire lijst 
//post: Sorted is true als L is gesorteerd van klein naar groot anders 
//is sorted false. 
{ 
    return L == NULL ? true : (L -> w) < (Sorted(L -> next)); 
}


zou dit kunnen werken?

http://specs.tweak.to/7860


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:03
De term 'lineaire lijst' zegt me niet zoveel (elke lijst is toch 'lineair'?); de datastructuur die je gebruikt staat over het algemeen bekend als 'linked list'. Verder dacht ik dat bool geen ANSI C datatype is.

Dat terzijde, is je oplossing niet correct. De expressie "(L->w) < (Sorted(L->next))" werkt natuurlijk niet, aangezien L->w een integer is en Sorted() een bool retourneerd. Nu kun je de twee in C wel vergelijken, maar het resultaat is natuurlijk vrij onzinnig. Deze expressie is wel aan te passen zo dat 'ie correct is, maar dan heb je nog steeds het probleem dat je een recursieve functie gebruikt. Dat betekent dat de grootte van de linked list van dezelfde orde is als de grootte van je stack. In het algemeen is je stack ook weer niet zo heel groot (denk aan een megabyte ofzo) dus eigenlijk is je oplossing niet al te geschikt. Probeer eens een iteratieve oplossing (met een for- of while-lusje, bijvoorbeeld) te schrijven.

  • rrrrob
  • Registratie: December 2003
  • Laatst online: 27-05 07:39
Linked List <--> Lineaire lijst = hetzelfde, dacht ik de leraar gebruikt ze in ieder geval ook door elkaar.
Zo had ik het nog niet bekeken, ga ik is ff proberen.
Bedankt voor de tip.


edit:

zoiets dan?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool KleinGroot (pEl L)
{
  bool hulp=true;
  
  while (L->next != NULL)
  {
     if ( ! ((L->w) < (L->next->w)) )
     {
       hulp = false;
       break;
     }
     else
     L = L -> next;
  }
}

[ Voor 82% gewijzigd door rrrrob op 24-01-2004 15:31 ]

http://specs.tweak.to/7860


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 07-04 13:41
Het kan aan mij liggen maar voldoet hier eigenlijk niet gewoon ieder sorteer algoritme?

  • rrrrob
  • Registratie: December 2003
  • Laatst online: 27-05 07:39
PrisonerOfPain schreef op 24 januari 2004 @ 15:46:
Het kan aan mij liggen maar voldoet hier eigenlijk niet gewoon ieder sorteer algoritme?
Dat weet ik niet, ik heb verder nog nooit iets moeten sorteren dus.....
we hebben in de praktikum opdrachtjes alleen lijsten moeten inlezen en naar scherm schrijven.
Nu voor het tentamen worden dit soort dingen gevraagd, en aangezien dit de 1e keer is dat ik een c tentamen krijg weet ik niet precies hoe en wat allemaal.
Maar ik probeer me natuurlijk wel zo goed mogelijk voor te bereiden.

http://specs.tweak.to/7860


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 07:42
- wat als je ljist leeg is ?
- waarom met zo'n vieze break werken ?

oplossing met een lusje is stuk beter dan een recursieve funtie te gebruiken voor zo'n probleem

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • rrrrob
  • Registratie: December 2003
  • Laatst online: 27-05 07:39
Cuball schreef op 24 januari 2004 @ 15:59:
- wat als je ljist leeg is ?
- waarom met zo'n vieze break werken ?

oplossing met een lusje is stuk beter dan een recursieve funtie te gebruiken voor zo'n probleem
- Lijst kan niet leeg zijn volgens de opdracht dus hoef ik daar ook niet op te controleren (misschien heb ik de opdracht hierboven niet helemaal goed omschreven 8)7 )

- Waarom geen break? wat is er mis met een break??

http://specs.tweak.to/7860


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Je hebt de break en hulpvariable niet nodig: je zou meteen een return false kunnen doen. Je weet nu dat als je de loop voortijdig verlaat, dat dan niet aan de klein-naar-groot-sorteer-eigenschap is voldaan. Als je wel de loop op een normale manier verlaat, dus als code in je functie na de while-loop wordt uitgevoerd, dat dan wel aan de eigenschap voldaan wordt en je een return true kan doen.

Aan de andere kant kan zo'n hulpvariable handig zijn. In plaats van de break zou je van je loopconditie kunnen maken: (L->next != NULL && hulp). Het voordeel hierbij is dat je nu alleen de loop kan verlaten wanneer deze conditie niet meer geldt. Dit is eenvoudiger wanneer je de correctheid van je code zou willen bewijzen (topics: "loop invariant" / "loop inductie").

Verder natuurlijk niet je "return hulp;" aan het eind van deze functie vergeten :)
En misschien dat je ook een toepasselijkere naam kan verzinnen voor je hulpvariable nu je toch bezig bent?

[ Voor 32% gewijzigd door Infinitive op 24-01-2004 16:47 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • rrrrob
  • Registratie: December 2003
  • Laatst online: 27-05 07:39
Infinitive schreef op 24 januari 2004 @ 16:44:
Je hebt de break en hulpvariable niet nodig: je zou meteen een return false kunnen doen. Je weet nu dat als je de loop voortijdig verlaat, dat dan niet aan de klein-naar-groot-sorteer-eigenschap is voldaan. Als je wel de loop op een normale manier verlaat, dus als code in je functie na de while-loop wordt uitgevoerd, dat dan wel aan de eigenschap voldaan wordt en je een return true kan doen.

Aan de andere kant kan zo'n hulpvariable handig zijn. In plaats van de break zou je van je loopconditie kunnen maken: (L->next != NULL && hulp). Het voordeel hierbij is dat je nu alleen de loop kan verlaten wanneer deze conditie niet meer geldt. Dit is eenvoudiger wanneer je de correctheid van je code zou willen bewijzen (topics: "loop invariant" / "loop inductie").

Verder natuurlijk niet je "return hulp;" aan het eind van deze functie vergeten :)
En misschien dat je ook een toepasselijkere naam kan verzinnen voor je hulpvariable nu je toch bezig bent?
Nog 1 laatste poging dan, naam is niet het belangrijkste in dit geval denk ik:

code:
1
2
3
4
5
6
7
8
9
10
11
bool Sorted (pEl L)
{
  bool hulp=true;
  
  while (L->next != NULL && hulp)
  {
     if ( ! ((L->w) < (L->next->w)) ) hulp = false;
     else L = L -> next;
  }
  return hulp; // natuurlijk deze niet vergeten
}

http://specs.tweak.to/7860


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:03
Hij lijkt me goed, zo. Zelf zou ik het korter doen en die hulpvariabele afschaffen. Sowieso vind ik 'hulp' geen variabelenaam; noem 'm dan gelijk 'a' of kies een echt zinnige naam 'gesorteerd' ofzo.

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 07-04 13:41
Mag ik vragen waar je de oude L dan laat?

Verwijderd

1. Je functie werk verkeerd als er twee dezelfde getallen in de lijst voorkomen (hij zal dan altijd false teruggeven, ookal is de lijst wel gesorteerd).

2. bool is geen C type (wel C++), in C gebruik je normaalgesproken het type int (0 = false en alles wat niet nul is is true). De waardes 'true' en 'false' bestaan dus ook niet in C. Wel kun je ze zelf definiëren, b.v.
#define TRUE 1
#define FALSE 0
Het is conventie om ze dan met hoofdletters te definiëren.

3. Over conventies (dit zijn geen programmeerfouten): normaalgesproken begin je functie- en variabelenamen niet met een hoofdletter, dus gebruik sorted i.p.v. Sorted en l i.p.v. L.

Verder zou hij inderdaad nog wel iets eleganter/eenvoudiger/korter kunnen...
Succes met je tentamen!

Edit: je gebruikt ook nog C++ stijl commentaren (die met //), dat is ook geen C. In C mag je alleen /* ... */ commentaren gebruiken.

[ Voor 10% gewijzigd door Verwijderd op 24-01-2004 18:43 ]


  • rrrrob
  • Registratie: December 2003
  • Laatst online: 27-05 07:39
Verwijderd schreef op 24 januari 2004 @ 18:39:
1. Je functie werk verkeerd als er twee dezelfde getallen in de lijst voorkomen (hij zal dan altijd false teruggeven, ookal is de lijst wel gesorteerd).
klopt, is met een "=" erbij ook opgelost, maar daar zal de leraar in een schriftelijk tentamen niet zoveel moeite mee hebben.
2. bool is geen C type (wel C++), in C gebruik je normaalgesproken het type int (0 = false en alles wat niet nul is is true). De waardes 'true' en 'false' bestaan dus ook niet in C. Wel kun je ze zelf definiëren, b.v.
#define TRUE 1
#define FALSE 0
Het is conventie om ze dan met hoofdletters te definiëren.
hmm, het vak heet c, het boek dat we gebruiken is "de programmeertaal c" en de programeeromgeving is borland c++. En de leraar gebruikt bool ook in zijn voorbeelden dus.....
3. Over conventies (dit zijn geen programmeerfouten): normaalgesproken begin je functie- en variabelenamen niet met een hoofdletter, dus gebruik sorted i.p.v. Sorted en l i.p.v. L.

Verder zou hij inderdaad nog wel iets eleganter/eenvoudiger/korter kunnen...
Succes met je tentamen!

Edit: je gebruikt ook nog C++ stijl commentaren (die met //), dat is ook geen C. In C mag je alleen /* ... */ commentaren gebruiken.
conventies, nooit van gehoord misschien volgend semester. (of ik heb niet goed opgelet)

http://specs.tweak.to/7860


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:03
rrrrob schreef op 24 januari 2004 @ 18:56:
hmm, het vak heet c, het boek dat we gebruiken is "de programmeertaal c" en de programeeromgeving is borland c++. En de leraar gebruikt bool ook in zijn voorbeelden dus.....
Nou? Dus wat?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 24 januari 2004 @ 18:39:
3. Over conventies (dit zijn geen programmeerfouten): normaalgesproken begin je functie- en variabelenamen niet met een hoofdletter, dus gebruik sorted i.p.v. Sorted en l i.p.v. L.
Dit is natuurlijk rijnste onzin. Jij doet dat zo, en ik ook, maar dat wil nog niet zeggen dat iedereen dat maar moet doen. Als hij z'n functies en variabelen wilt laten beginnen met hoofdletters is daar natuurlijk niets mis mee.

en rrrrob, je leraar mag dan wel bool gebruiken, maar dat wil nog niet zeggen dat het ook goed is. Eigenlijk gebruiken jullie volgens mij gewoon een C++ compiler om C-code te compileren, wat in de meeste gevallen wel goed gaat. Alleen je zit wel ineens met het feit dat dingen die in C fout horen te gaan ook ineens goed kunnen gaan (zoals het gebruik van bool)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Het kan nog iets simpeler:
C:
1
2
3
4
5
6
7
8
9
bool Sorted (pEl L)
{
  while (L->next) {
    if(L->w > L->next->w)
      return false;
    L = L->next;
  }
  return true;
}

Dit dus afgezien van bovenstaande conventies en dat het type bool in C niet bestaat. Verder ook niet getest... veel succes ermee :)
Oh ja, een lege lijst kan hier dus niet bestaan omdat je altijd tenminste een element hebt, namelijk dat waarnaar de pointer verwijst. Of wordt anders een NULL-pointer gegeven?

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
.oisyn schreef op 26 januari 2004 @ 15:06:
Alleen je zit wel ineens met het feit dat dingen die in C fout horen te gaan ook ineens goed kunnen gaan (zoals het gebruik van bool)
En andersom .... :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Zelfde code, alleen dan poging voor onleesbaarheids prijs ;)
C:
1
2
3
4
5
bool Sorted(pEl L){ 
  for(;L->next;L=L->next)
    (L->w > L->next->w)?return 0:;
  return 1; 
}

"Beauty is the ultimate defence against complexity." David Gelernter


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

wat in de meeste gevallen wel goed gaat
;)
Macros schreef op 27 januari 2004 @ 00:54:
Zelfde code, alleen dan poging voor onleesbaarheids prijs ;)
C:
1
2
3
4
5
bool Sorted(pEl L){ 
  for(;L->next;L=L->next)
    (L->w > L->next->w)?return 0:;
  return 1; 
}
het lijkt me wel noodzakelijk dat het gewoon compiled :Y)

[ Voor 50% gewijzigd door .oisyn op 27-01-2004 00:59 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1