Akademin för innovation, design och teknik Caroline Uppsäll 1(5) Datastrukturer,algoritmerochprogramkonstruktion DVA104,HT2015 Laboration2–Lista&Kö Tänk igenom och diskutera ADT:n innan ni börjar implementera! Glöm inte att skriva ner precondition, postcondition, returvärde och övrig viktig information som kommentar i koden. Uppgift 1 – ADT Länkad Lista Ni ska i den här labben bygga en länkad lista. Om den är enkellänkad eller dubbellänkad bestämmer ni själva, ni bestämmer också om den ska ha referens endast till första noden (header) eller om det också ska finnas referens till sista noden (tail). Ni ska skapa en nod (strukt), datat som lagras i noden kan vara ett heltal, samt alla de funktioner som behövs för att hantera noden och listan. Listan ska kunna bestå av godtyckligt många element av den nod ni skapat. Det ni ska kunna göra med List-ADT:n är minst följande: • • • • • • Lägga till en ny nod någonstans i listan. Man ska kunna lägga till den nya noden först, sist eller mitt i listan baserat på t.ex. data eller ordning (ni bestämmer själva på vilket sätt man väljer plats mitt i listan). Fundera på om detta bör delas upp på tre funktioner. Ta bort någon nod i listan. Man ska kunna ta bort den första noden, den sista noden eller en nod mitt i listan baserat på t.ex. data eller ordning (ni bestämmer själva på vilket sätt man väljer plats mitt i listan) . Består listan av endast en nod ska man självklart kunna ta bort även den. Är listan tom kan det vara en bra idé att meddela användaren om detta. Fundera på om detta bör delas upp på tre funktioner. Skriv ut hela listan från början till slut. Sök efter ett visst data i listan. Om funktionen endast ska returnera huruvida datat finns eller inte eller om den eftersökta noden ska returneras bestämmer ni själva. Tömma hela listan (om man t.ex vill börja bygga på en ny så ska man kunna göra det utan att starta om programmet). Avsluta programmet. Finns det fler operationer ni vill kunna göra med er länkade listan så får ni självklart implementera funktioner för det också. Se till så att programmet är väl strukturerat och att ni väljer bra namn på variabler och funktioner samt ser till att kommentera koden så att den blir lättläst. Glöm inte att göra ett huvudprogram med en meny så att ni kan testa er lista ordentligt. Projektet ska bestå av en h-fil innehållande listans interface, minst en c-fil innehållande listans kod samt en c-fil innehållande huvudprogrammet. Akademin för innovation, design och teknik Caroline Uppsäll 2(5) Diskutera gärna er planerade lösning med labbassen eller läraren innan ni börjar implementera. Längst ner i denna labbspec finns ett exempel på hur listans interface kan se ut. Exakt hur listans strukter samt funktioner ser ut beror självklart på vilken typ av listan man väljer att göra samt hur man väljer att implementera sina funktioner. Glöm inte att återlämna dynamiskt allokerat minne! Uppgift 2 – ADT Kö, FIFO Ni ska nu göra en Kö-ADT genom att återanvända er länkade lista från uppgift 1. Kön ska alltså i bakgrunden vara en länkad lista men med begränsade operationer. Håll i åtanke att återanvända inte är detsamma som att kopiera, kopiera får ni inte göra. Den kö ni ska göra en ADT för är en FIFO kö så tänk på vilken funktionalitet en sådan ska ha. Kön ska ha kapacitet för godtyckligt många köelement. Glöm inte att göra ett huvudprogram med en meny så att ni kan testa er kö ordentligt. Precis som listan ska kön bestå av minst tre filer (även listans c och h-fil måste inkluderas i projektet för kön). Diskutera gärna er planerade lösning med labbassen eller läraren innan ni börjar implementera. Exempel på hur interfacet för kön kan se ut: /*Då kön ska återanvända listan måste denna vara inkluderad (så att kön har tillgång till listans funktioner)/* #include "LinkedList.h" #ifndef projektnamn_filnamn_h #define projektnamn_filnamn_h /*Kön är i bakgrunden en länkad lista = återanvändning*/ typedef struct Queue{ List *queue; }Queue; /*Allokerar dynamiskt minne för en kö. Retur - den skapade kön eller NULL om minne inte gick att allokera*/ Queue *createQueue(); /*Lägger till nod innehållande value först i kön - enligt FIFO*/ void addToQueue(Queue *myQueue, int value); /*Tar bort den sista noden - enligt FIFO*/ void removeFromQueue(Queue *myQueue); /*skriver ut hela kön*/ void printQueue(Queue *myQueue); /*Returnerar antal noder i kön*/ int noOfNodesInQueue(Queue *myQueue); /*Frigör minnet för samtliga noder i kön*/ Akademin för innovation, design och teknik Caroline Uppsäll 3(5) void emptyQueue(Queue *myQueue); /*Frigör minnet för samtliga noder i kön samt minnet för själva kön*/ void destroyQueue(Queue *myQueue); #endif Exempel på återanvändning av listan i kön (c-filen). /*Tar bort den sista noden - enligt FIFO*/ void removeFromQueue(Queue *myQueue) { removeLast(myQueue->queue); /*anropa funktionen i listan som tar bort sist*/ } Redovisning Samtliga uppgifter ska redovisas muntligt under ett och samma redovisningstillfälle genom att visa fungerande implementationer till labbassistenten. Om samtliga laborationer redovisats och godkänts innan tentamen erhålls bonuspoäng på denna. Tänk dock på att redovisa labbarna utspridda under hela kursens gång då det troligtvis inte finns tid om alla ska redovisas på slutet. Akademin för innovation, design och teknik Caroline Uppsäll 4(5) Exempel på hur interfacet för listan kan se ut: följande funktioner är iterativa. #ifndef projektnamn_filnamn_h #define projektnamn_filnamn_h /*Noden - Detta är en nod i en enkellänkad listan, det går givetvis även bra att göra en dubbellänkad lista, (vissa funktioner blir kan då bli annorlunda)*/ typedef struct Node{ int data; struct Node *next; }Node; /*Listan - kan även innehålla tail (vissa funktionerna kan då bli annorlunda) - kan även innehålla en räknare som räknar antal noder*/ typedef struct List{ Node *head; }List; /*Allokerar minne för en lista. Retur - en pekare till den nya Lista om allokering lyckades NULL om allokering inte lyckades*/ List *createList(); /*Allokerar minne för en nod samt lägger value i datafältet, sätter next till null Retur - en pekare till den nya noden om allokering lyckades NULL om allokering inte lyckades*/ Node *createNode(int value); /*Returnerar antal noder i listan*/ int noOfNodesInList(List *myList); /*Lägger till en nod först i listan pre - den nya noden är skapad (självklart kan man även välja att skapa den nya noden inne i funktionen). post - listan pekar på den nya noden, den nya noden pekar på resten av listan*/ void addNewNodeFirst(List *myList, Node *newNode); /*Lägger till en nod sist i listan pre - den nya noden är skapad (självklart kan man även välja att skapa den nya noden inne i funktionen). post - den nya noden har lagts till sist i listan, om listan är tom läggs den till vid listans början*/ void addNewNodeLast(List *myList, Node *newNode); /*Lägger till en nod efter noden innehållande value (går självklart även att göra på position) Pre - den nya noden är skapad (självklart kan man även välja att skapa den nya noden inne i funktionen). Post - den nya noden har lagts till efter noden innehållande value. Vad händer om value inte finns i listan eller om listan är tom?*/ void addNewNodeAfter(List *myList, Node *newNode, int value); Akademin för innovation, design och teknik Caroline Uppsäll 5(5) /*skriver ut hela listan. Om ingen lista finns skrivs det ut*/ void printList(List *myList); /*Tar bort den första noden i listan Pre - listan är inte tom Post - listan pekar på den andra noden den tidigare första noden är borttagen och minnet frigjort*/ void removeFirst(List *myList); /*Tar bort den sista noden i listan Pre - listan är inte tom Post - nextpekaren i den näst sista noden är satt till NULL den tidigare sista noden är borttagen och minnet frigjort*/ void removeLast(List *myList); /*Tar bort noden innehållande value (går självklart även att göra på position) Pre - listan är inte tom och det finns en nod innehållande value i listan Post - noden innehållande value är borttagen*/ void removeNode(List *myList, int value); /*Tar bort och frigör minne för alla noder i listan. Sätter listans huvud till NULL*/ void emptyList(List *myList); /*Tar bort och frigör minne för listan*/ void destroyList(List *myList); /*Söker efter x i listan Retur – 1 om x finns i listan, annars 0. (Man kan också tänka sig att returnera t.ex den funna noden, positionen eller liknande. */ int search (Node *myNode, int x); #endif
© Copyright 2025