2014-02-11 26 views
0

這是我如何實現一個隊列鏈接隊列。由於add函數工作不正常,我無法測試其他函數,除了似乎正在工作的new_queue外。Dyanmic隊列優先,添加功能不起作用

#include <stdlib.h> 

struct Qelement { 
    struct Qelement *next; 
    int prio; 
    const char *dataptr; 
}; 

typedef struct Qelement *Queue; 

// creates an empty queue 
Queue new_queue() 
{ 
     Queue q = (Queue)malloc(sizeof(struct Qelement)); 
     q->next = NULL; 
     q->prio = 0; 
     q->dataptr = NULL;  
     return q; 
} 

// removes the queue and all its elements 
void delete_queue (Queue q) 
{ 
     Queue tmp; 
     while (q->next != NULL) 
     { 
       tmp = q->next; 
       free (q); 
       q = tmp; 
     } 

     free(q); 
} 

// emmpties queue 
void clear (Queue q) 
{ 
     Queue tmp; 
     while (q->next != NULL) 
     { 
       tmp = q->next; 
       free (q); 
       q = tmp; 
     } 

     q->next = NULL; 
     q->prio = 0; 
     q->dataptr = NULL; 
} 

// get length of queue 
int size (Queue q) 
{ 
     Queue orginal = q; 

     int length = 0; 
     while (q->next != NULL) 
     { 
       ++length; 
       q = q->next; 
     } 

     ++length; 
     q = orginal; 

     return length; 
} 

// add an element to queue 
void add (Queue q, int priority, Datatyp *d) 
{ 
     Queue tmp; 
     Queue previous = q; 

     Queue element = (Queue)malloc (sizeof(struct Qelement)); 
     element->next = NULL; 
     element->prio = priority; 
     element->dataptr = d; 

     if (priority > previous->prio) 
     { 
       tmp = q; 
       q = element; 
       element->next = tmp;   
     } 
     else 
     { 
       if (previous->next != NULL) 
       { 
         while (priority <= previous->next->prio) 
         { 
           previous = previous->next; 
         } 

         previous->next = element; 
         element->next = previous->next->next; 
       } 
       else 
       { 
         //previous->next = element; 
       } 
     } 
} 

// return first element 
Datatyp *get_first (Queue q) 
{ 
     return q->dataptr; 
} 

// removes first element 
void remove_first(Queue q) 
{ 
     Queue tmp = q->next; 
     q = q->next; 
     free(tmp); 
} 

int main(int argc, char *argv[]) { 
    const char *daniel = "Daniel"; 
    const char *lisa = "Lisa"; 
    const char *a[] = {"Kalle", "Olle", "Eva", lisa, "Stina", 
         "Peter", "Anna", daniel, "Johan", "Maria"}; 
    const int correctOrder1[] = {3, 7, 2, 6, 1, 5, 9, 0, 4, 8 }; 
    const int correctOrder2[] = {5, 4, 7, 3, 6}; 

    Queue q = new_queue(); 
    int i; 

    for (i=0; i<10; i++) { 
     add(q, i%4, a[i]); 
    } 

    printf("Size = %d\n\n", size(q)); // says 1, should say 10 
    ... 
} 

最後一個printf,在main函數中是1,所以我認爲add部分工作不正常。任何指針?

回答

0

在功能add,你需要傳遞一個Queue*,實際上爲了改變它的功能外:

void add (Queue* q, int priority, Datatyp *d) 
{ 
    ... 
    Queue previous = *q; 
    ... 
    if (priority > previous->prio) 
    { 
     tmp = *q; 
     *q = element; 
     element->next = tmp;   
    } 
    ... 
} 

然後,在功能main,你需要調用add(&q, i%4, a[i])而不是add(q, i%4, a[i])

順便說一句,你有任何其他功能試圖改變q相同的問題!

因此,解決此問題的另一種方法是將Queue q聲明爲全局變量,而不是將其傳遞給每個函數。但這會阻止你使用幾個不同的隊列當然...

+0

從'typedef struct Qelement * Queue'這仍然是一個問題?隊列已經是一個指向Qelement結構的指針。 – Emz

+0

沒關係。當您更改傳遞給函數的局部變量時,它只會在該函數的範圍內發生變化。您需要傳遞該變量的地址,並在函數內部更改該地址的內存內容。換句話說,調用'func(&q,...)'和'func'裏面,設置'* q = ...'。 –

+0

void getWordsFromFile(char ** str){... str [0] = ...; }將工作,我相信,我在另一個函數中使用它,調用getWordsFromFile而不從主函數中引用。我已經傳遞了一個指針,該函數接受一個指針,它沒有本地存儲的變量。它已經直接在內存上工作了。 – Emz