2013-05-04 99 views
0

我的程序有問題。我創建了一個鏈接列表隊列,當我用我的delQueue函數清除隊列時,我的隊列消失了,我再也不能推動任何東西了。鏈表C編程隊列

我該如何解決這個問題?我的推送功能正常工作,除非我從隊列中刪除所有內容。

這裏是我的代碼:

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

int count = 0; 

struct Node 
{ 
    int Data; 
    struct Node* next; 
}*rear, *front; 

void delQueue() 
{ 

    struct Node *var=rear; 
    while(var!=NULL) 
    { 
     struct Node* buf=var->next; 
     free(var); 
     count = count + 1; 

    } 

} 

void push(int value) 
{ 
    struct Node *temp; 
    temp=(struct Node *)malloc(sizeof(struct Node)); 
    temp->Data=value; 
    if (front == NULL) 
    { 
     front=temp; 
     front->next=NULL; 
     rear=front; 
    } 
    else 
    { 
     front->next=temp; 
     front=temp; 
     front->next=NULL; 
    } 
} 

void display() 
{ 
    struct Node *var=rear; 
    if(var!=NULL) 
    { 
     printf("\nElements in queue are: "); 
     while(var!=NULL) 
     { 
      printf("\t%d",var->Data); 
      var=var->next; 
     } 
    printf("\n"); 
    } 
    else 
    printf("\nQueue is Empty\n"); 
} 
+1

當你'推'你正在更新'前'。當你推動時不應該更新'後部'?隊列先進先出...所以當你推動時,'後部'指針應該被更新。 – Bill 2013-05-04 02:16:18

+0

非常感謝大家,您一直非常樂於助人。我非常感謝我在這裏收到的所有幫助,並且我肯定了解了很多關於隊列的知識。比你再次。上帝保佑你們所有人 – user2133160 2013-05-04 02:43:47

+0

你應該接受你認爲最好回答你的問題的答案;) – Bill 2013-05-04 02:51:58

回答

0
void delQueue() 
{ 
    while(rear != NULL) { 
     struct Node* var=rear->next; 
     free(rear); 
     count = count + 1; 
     rear = var;   /* update rear */ 
    } 
    front = NULL; /* clear the front */ 
} 
+0

我的隊列現在存在,但我不能添加任何東西,它不會推入任何東西,但是隊列在那裏並且是空的。 – user2133160 2013-05-04 02:28:18

+0

看到更新,也許這是因爲你沒有重置'front'。 – perreal 2013-05-04 02:31:32

+0

由於它是一個隊列,我更喜歡從前面刪除,正如我的答案中所給出的。否則你失去了一個隊列的含義,先進先出 – Bill 2013-05-04 02:35:55

0

您正在看的「變種」你釋放後(當你周圍的循環再次去)。你是否想在delQueue()的循環中分配「var = buf」?

另外,不要忘記在你的push()例程中檢查malloc()返回NULL值。即使這只是一個小的學習計劃,你應該學會經常檢查...

0
int delQueue() 
    { 
    int count = 0; 
    while (front != NULL) 
    { 
    struct Node * temp = front; 
    front = front -> next; 
    free (temp); 
    count++; 
    } 
    rear= NULL; 

    return count; 
    } 

既然是排隊,我寧願從前面刪除元素,而不是後面。

+0

它的工作完美,但我似乎無法看清計數我刪除了多少項目。我會在哪裏放? – user2133160 2013-05-04 02:35:04

+0

在代碼中添加了計數:)並且函數現在返回計數... – Bill 2013-05-04 02:39:21

0

你必須在delQueue()

後部=前面= NULL的末尾添加以下行;