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部分工作不正常。任何指針?
從'typedef struct Qelement * Queue'這仍然是一個問題?隊列已經是一個指向Qelement結構的指針。 – Emz
沒關係。當您更改傳遞給函數的局部變量時,它只會在該函數的範圍內發生變化。您需要傳遞該變量的地址,並在函數內部更改該地址的內存內容。換句話說,調用'func(&q,...)'和'func'裏面,設置'* q = ...'。 –
void getWordsFromFile(char ** str){... str [0] = ...; }將工作,我相信,我在另一個函數中使用它,調用getWordsFromFile而不從主函數中引用。我已經傳遞了一個指針,該函數接受一個指針,它沒有本地存儲的變量。它已經直接在內存上工作了。 – Emz