Files
2026-03-05 13:39:39 +01:00

240 lines
5.9 KiB
C++

/************************************************
* Laboration 4 i
* Datastrukturer och Algoritmer
* Dijkstras Shortest Path
*************************************************
* Christian Ohlsson
* Karlstads universitet, 1999
*
* list.h
* Innehåller definitioner och funktioner
* för en templatelista.
*************************************************/
#ifndef _LISTA_H_
#define _LISTA_H_
#include "header.h"
/*===============================================
* list
* Denna klass skapar en templatelista.
* Varje nod innehåller ett godtyckligt data-
* fält och en pekare till nästa nod.
-------------------------------------------------*/
template <class T>
class list {
private:
struct nod { // En template nod
T data;
nod *next;
};
int size; // Storleken på listan.
nod *head; // Pekar på första elementet i listan.
public:
list();
~list();
int listLength(); //Storleken på listan
void insert(T data); //Sätter in en nod
void del(int place); //Tar bort en nod
void sort(void); //Sorterar listan
int seek(T data); //Söker i listan
int isFree(void); //Kollar om det finns element i listan
void delAll(void); //Tar bort allt i listan
int occupiedExist(T data); //Kollar om inmatat värde existerar
int occupied(int place); //Testar om det finns plats
void setNode(nod *dat, T data); //Mata in data i den nya noden
T printElement(int place); //Visar Innehållet på bestämd plats.
T *getPtr(int place); //Returnera platsen på place position
};
/*===============================================
* list
* Construktor, skapar en lista
-------------------------------------------------*/
template <class T>
list<T>::list() {
head = NULL;
size = 0;
}
/*===============================================
* ~list
* Destruktor. Anropar delAll
-------------------------------------------------*/
template <class T>
list<T>::~list() { delAll(); }
/*===============================================
* insert
* Sätter in en ny nod i listan
-------------------------------------------------*/
template <class T>
void list<T>::insert(T data) {
nod *newNode = new nod;
newNode->next = head;
head = newNode;
size++;
newNode->data = data;
}
/*===============================================
* del
* Tar bort ett element på en viss
* position i listan
-------------------------------------------------*/
template <class T>
void list<T>::del(int place) {
int i = 1;
nod *temp1;
temp1 = head;
nod *temp2;
temp2 = head->next;
if(temp2 == NULL || place == 1) { //Bara ett element i listan
head = temp1->next;
delete temp1;
size--;
}
else { //Flera element i listan
temp2 = head;
while(i < place) {
temp1 = temp2;
temp2 = temp1->next;
i++;
}
temp1->next = temp2->next;
delete temp2;
size--;
}
}
/*===============================================
* isFree
* Kollar om listan är tom. Returnerar
* true om listan är tom
-------------------------------------------------*/
template <class T>
int list<T>::isFree() {
if(size == 0) return true;
else return false;
}
/*===============================================
* occupied
* Kollar om plats finns på en angiven
* position.
-------------------------------------------------*/
template <class T>
int list<T>::occupied(int place) {
if( (place < 1) || (place > size) ) return false;
else return true;
}
/*===============================================
* listLength
* Returnerar antalet element i listan
-------------------------------------------------*/
template <class T>
int list<T>::listLength() { return size; }
/*===============================================
* sort
* Sorterar elementen i listan
-------------------------------------------------*/
template <class T>
void list<T>::sort() {
nod *temp;
T sop;
int changed;
do {
changed = 0;
for(temp = head; temp != NULL; temp = temp->next)
if(temp->data > temp->next->data) {
sop = temp->data;
temp->data = temp->next->data;
temp->next->data = sop;
changed = 1;
}
}while(changed);
}
/*===============================================
* delAll
* Tar bort alla element i listan.
* Sätter sedan storleken till 0
-------------------------------------------------*/
template <class T>
void list<T>::delAll() {
nod *temp1 = head;
nod *temp2;
head = NULL;
while(temp1 != NULL) {
temp2 = temp1;
temp1 = temp1->next;
delete temp2;
}
size = 0;
}
/*===============================================
*
*
-------------------------------------------------*/
template <class T>
int list<T>::occupiedExist(T data) { //Kollar om inmatat värde existerar
nod *temp;
for(temp = head; temp != NULL; temp = temp->next)
if(temp->data == data)
return true;
return false;
}
/*===============================================
*
*
-------------------------------------------------*/
template <class T>
int list<T>::seek(T data) { //Söker efter ett element i listan
nod *temp;
int position = 0;
for(temp = head; temp != NULL; temp = temp->next) {
position++;
if(temp->data == data)
return position; //Funnet! Returnera positionen
}
position = 0;
return position; //Inget hittades, returnera 0
}
/*===============================================
* printElement
* Hämtar element på en angiven plats
-------------------------------------------------*/
template <class T>
T list<T>::printElement(int place) {
nod *temp1 = head;
int i = 1;
while(i < place && i < size) {
temp1 = temp1->next;
i++;
}
return temp1->data;
}
/*===============================================
* getPtr
* Returnera adressen till ett element
* på en angiven plats
-------------------------------------------------*/
template <class T>
T *list<T>::getPtr(int place) {
nod *temp1 = head;
int i = 1;
while(i < place && i < size) {
temp1 = temp1->next;
i++;
}
return &(temp1->data);
}
#endif