Advertisement
Duhan

P2 Source

May 13th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.09 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "queue.h"
  5.  
  6. priorityqueue_t* pqueue_create(void) {
  7.     priorityqueue_t *tmp = malloc(sizeof(priorityqueue_t));  //Speicher für Queue reservieren
  8.     if(tmp == NULL) {
  9.         printf("Kein Speicher für Queue verfügbar\n");
  10.         return NULL;
  11.     }
  12.     else { //   0-te Position wird erstellt und Queue
  13.         tmp -> size = 0;
  14.         tmp -> head = NULL;
  15.         return tmp;
  16.     }
  17. }
  18.  
  19. void pqueue_insert(priorityqueue_t *pq, char *value, float p) {
  20.  
  21.     if(pq == NULL) {                //Abfrage ob Queue vorhanden
  22.         printf("Warteschlange ist nicht vorhanden\n");
  23.         return;
  24.     }
  25.  
  26.     //Neues Element
  27.     pquentry_t *newElement = malloc(sizeof(pquentry_t)); //speicherplatz reservieren
  28.     if(newElement == NULL) {
  29.         printf("Kein Speicher verfügbar für Element\n");
  30.         return;
  31.     }
  32.  
  33.     newElement -> p = p; // Element kriegt p als Priorität
  34.  
  35.     int counter = 0;    //Werkzeug um Länge zu ermitteln etc.
  36.     for(int x = 0; value[x] != '\0'; x++) { //laenge ermitteln und  in counter einfügen
  37.         counter++;
  38.     }
  39.  
  40.     newElement -> value = malloc((counter + 1)*sizeof(char)); //Speicher für Wert des neuen Elements
  41.     if(newElement -> value == NULL) {           //Überprüfung des Werts
  42.         printf(" Element kann folgenden Wert nicht erhalten  \n");
  43.         return;    }
  44.  
  45.  
  46.     for(int x = 0; x < counter + 1; x++) {   //Value kriegt einen String
  47.         newElement -> value[x] = value[x];
  48.     }
  49.  
  50.     //Einfügen in die Liste
  51.     if(pq -> size == 0) {         //Überprüfung ob nur ein Element in der Liste
  52.         pq -> head = newElement;
  53.         pq -> size++;
  54.         newElement -> next = NULL;
  55.     }
  56.     else {
  57.         newElement -> next = NULL;
  58.         pq -> size++;
  59.  
  60.         pquentry_t *temp = pq -> head; //tempörärer Zeiger der durchgeht um richtig einzusotiren
  61.  
  62.         //Element einsortieren
  63.         if(newElement -> p < temp -> p) {
  64.             newElement -> next = temp;
  65.             pq -> head = newElement;
  66.             return;
  67.         }
  68.  
  69.         while(temp->next) {
  70.             if(newElement -> p <= temp -> next -> p) {
  71.                 newElement -> next = temp -> next;
  72.                 temp -> next = newElement;
  73.                 return;
  74.             }
  75.             else {
  76.                 temp = temp-> next;
  77.             }
  78.         }
  79.         temp->next = newElement;
  80.     }
  81. }
  82.  
  83. char* pqueue_extractMinimum(priorityqueue_t *pq) {
  84.     //Liste ist schon sortiert also einfach erstes Element rausnehmen
  85.     char* minimum = pq -> head -> value;
  86.     pquentry_t *tmp = pq -> head;
  87.     pq -> head = tmp -> next;
  88.  
  89.     free(tmp->value);
  90.     free(tmp);
  91.     pq -> size--;
  92.     //printf("Minimum: %s\n", minimum);
  93.     return minimum;
  94. }
  95.  
  96. void pqueue_decreaseKey(priorityqueue_t *pq, char *value, float p) {
  97.     if(pq == NULL || pq -> size == 0) { //Liste Leer
  98.         return;
  99.     }
  100.     else if (pq -> size == 1) { //Bei einem Element muss die Reihenfolge nicht geändert werden
  101.         pq -> head -> p = p;
  102.         return;
  103.     }
  104.     else { //Element entfernen und mit neuer Priorität an die richtige Stelle einfügen
  105.         pqueue_remove(pq, value);
  106.         pqueue_insert(pq, value, p);
  107.         return;
  108.     }
  109. }
  110.  
  111. void pqueue_remove(priorityqueue_t *pq, char *value) {
  112.     if(pq == NULL || pq -> size == 0) {     //kicken der geringsten prioritat
  113.         printf("Shishabar wird renoviert\n");
  114.         return;
  115.     }
  116.  
  117.     pquentry_t *curr = pq -> head; //neues temp
  118.  
  119.     //Wenn erstes Element gelöscht wird, dann anderer Löschvorgang
  120.     if(strcmp(value, curr -> value) == 0) {
  121.         //strcmp(value, curr -> value) == 0
  122.         pq -> head = curr -> next;
  123.         free(curr);
  124.         pq -> size--;
  125.         return;
  126.     }
  127.  
  128.     //Alle anderen Elemente
  129.     for(int x = 0; x < ((pq -> size)-1); x++) {
  130.         if(strcmp(value, curr -> next -> value) == 0) {
  131.             pquentry_t *tmp = curr -> next;
  132.             curr -> next = curr -> next -> next;
  133.             free(tmp->value);
  134.             free(tmp);
  135.             pq -> size--;
  136.             return;
  137.         }
  138.         curr -> next = curr -> next -> next;
  139.     }
  140. }
  141.  
  142. void pqueue_destroy(priorityqueue_t *pq) {
  143.     if(pq == NULL) {
  144.         return;
  145.     }
  146.     else if(pq -> size == 0) {      //wenn warteschlange vorhanden wo 0 eintrag oder keine warteschlange nichts ansonnst loschen mit temporare zeiger
  147.         free(pq);
  148.         return;
  149.     }
  150.     else {
  151.         pquentry_t *tmp = pq -> head;
  152.         while(pq -> size != 0) {
  153.             pq->head = pq->head->next;
  154.             free(tmp);
  155.             pq -> size--;
  156.             tmp = pq->head;
  157.         }
  158.         free(pq);
  159.         return;
  160.     }
  161. }
  162.  
  163. void pqueue_print(priorityqueue_t *pq) {
  164.     pquentry_t *tmp = pq -> head;
  165.     printf("\n");
  166.     printf("--Anfang der Liste--\n");
  167.     for(int x = 0; x < pq -> size; x++) {
  168.         printf("Anzahl %d: Priorität: %f Value: %12s|\n", x, tmp -> p, tmp -> value);      //gibt ganze elemente der warteschlange aus und beinnt von anfang
  169.         tmp = tmp -> next;
  170.     }
  171.     printf("--Ende der Liste--\n");
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement