Curahee Q
Legacy Member
Beste 9Livers
Als laatste labo van het academiejaar (3 weken terug ofzo) hebben we nog een opdracht gekregen om een eigen linked list te maken. Ik was hier al aan begonnen maar heb het vandaag opnieuw gemaakt om te zien of ik alles nu zelf kon schrijven (vooral het oefenen op pointers).
De klasse kregen we en die heb ik dan in lijst.h gestoken als volgt
Dus aan de klasse moet niets meer veranderd worden want dit was de opgave. Nu heb ik alle lidfuncties verder uitgewerkt en is het uiteindelijk het volgende geworden (lijst.cpp)
Het werkt deftig. Maar toch zou ik jullie willen vragen om te kijken of er nog verbeteringen aangebracht kunnen worden.
De main ziet er dan zo uit
Alvast bedankt
Als laatste labo van het academiejaar (3 weken terug ofzo) hebben we nog een opdracht gekregen om een eigen linked list te maken. Ik was hier al aan begonnen maar heb het vandaag opnieuw gemaakt om te zien of ik alles nu zelf kon schrijven (vooral het oefenen op pointers).
De klasse kregen we en die heb ik dan in lijst.h gestoken als volgt
Code:
#ifndef LIJST_H
#define LIJST_H
#include <string>
using namespace std;
typedef int Sleuteltype;
typedef string Datatype;
class Lijst {
public:
Lijst();
Lijst(const Lijst &l);
~Lijst();
bool is_ledig() const;
int lengte() const;
void schrijf() const;
Datatype* zoek(const Sleuteltype & s);
void voeg_toe(const Sleuteltype & s, const Datatype & d);
void verwijder(const Sleuteltype & s);
void samenvoegen_met(const Lijst & l);
private:
struct Knoop {
Sleuteltype sleutel;
Datatype data;
Knoop *vlg;
};
Knoop *begin;
};
#endif
Dus aan de klasse moet niets meer veranderd worden want dit was de opgave. Nu heb ik alle lidfuncties verder uitgewerkt en is het uiteindelijk het volgende geworden (lijst.cpp)
Code:
#include <iostream>
#include "lijst.h"
using namespace std;
/*
* Constructor
*/
Lijst::Lijst() {
begin = 0;
}
/*
* Copy Constructor
*/
Lijst::Lijst(const Lijst & l) {
Knoop *l_k = l.begin;
if(l_k != 0) {
Knoop *knoop = new Knoop;
knoop->data = l_k->data;
knoop->sleutel = l_k->sleutel;
begin = knoop;
l_k = l_k->vlg;
Knoop *temp = begin;
while(l_k != 0) {
Knoop *kn = new Knoop;
kn->data = l_k->data;
kn->sleutel = l_k->sleutel;
temp->vlg = kn;
temp = kn;
l_k = l_k->vlg;
}
temp->vlg = 0;
}
else {
begin = 0;
}
}
/*
* Destructor, maakt geheugen terug vrij
*/
Lijst::~Lijst() {
if(begin != 0) {
Knoop *k = begin;
while(k->vlg != 0) {
k = k->vlg;
delete begin;
begin = k;
}
delete begin;
}
}
/*
* Kijkt of de lijst ledig is, of maw als begin naar nullpointer verwijst
*/
bool Lijst::is_ledig() const {
return begin==0;
}
/*
* Geeft het aantal knopen binnen de lijst weer
*/
int Lijst::lengte() const {
Knoop *k = begin;
int len=0;
while(k != 0) {
len++;
k = k->vlg;
}
return len;
}
/*
* Schrijft de gegevens naar het scherm onder de vorm <sleutel>: <data>
*/
void Lijst::schrijf() const {
Knoop *k = begin;
while(k != 0) {
cout << k->sleutel << ": " << k->data << endl;
k = k->vlg;
}
}
/*
* Zoekt naar een bepaalde sleutel en geeft een pointer naar de data terug
* Indien desbetreffende knoop niet gevonden is wordt er een nullpointer teruggegeven
*/
Datatype* Lijst::zoek(const Sleuteltype & s) {
Knoop *k = begin;
while(k != 0 && s != k->sleutel) {
k = k->vlg;
}
return (k==0?0:&(k->data)); // Als k de nullpointer is, return nullpointer anders adres naar k->data
}
/*
* Voegt data toe aan de lijst, duplicaten worden weerhouden
*/
void Lijst::voeg_toe(const Sleuteltype & s, const Datatype & d) {
if(zoek(s) == 0) { // Vermijd duplicaten
Knoop *l = begin;
Knoop *k = new Knoop; // aanmaken nieuwe knoop
k->sleutel = s;
k->data = d;
if(begin == 0 || s < begin->sleutel) {
begin = k;
k->vlg = l;
}
else {
while(l->vlg != 0 && s > l->vlg->sleutel) {
l = l->vlg;
}
k->vlg = l->vlg;
l->vlg = k;
}
}
}
/*
* Verwijdert een knoop aan de hand van de sleutel
*/
void Lijst::verwijder(const Sleuteltype & s) {
Knoop *k = begin;
if(begin != 0) {
if(s == k->sleutel) {
begin = k->vlg;
delete k;
}
else {
while(k->vlg != 0 && s > k->vlg->sleutel) {
k = k->vlg;
}
if(k->vlg != 0 && s == k->vlg->sleutel) {
Knoop *l = k->vlg;
k->vlg = k->vlg->vlg;
delete l;
}
}
}
}
/*
* Voegt de data van l toe aan deze lijst, duplicaten worden weerhouden
*/
void Lijst::samenvoegen_met(const Lijst & l) {
Knoop *k = l.begin;
while(k != 0) {
voeg_toe(k->sleutel, k->data);
k = k->vlg;
}
}
Het werkt deftig. Maar toch zou ik jullie willen vragen om te kijken of er nog verbeteringen aangebracht kunnen worden.
De main ziet er dan zo uit
Code:
#include <string>
#include "lijst.cpp"
using namespace std;
int main() {
Lijst l;
l.voeg_toe(1, "een");
l.voeg_toe(5, "vijf");
l.voeg_toe(3, "drie");
l.voeg_toe(8, "acht");
l.voeg_toe(2, "twee");
l.schrijf();
return 0;
}
Alvast bedankt

