2013-05-06 23 views
0

正如標題宣佈,我有一個關於有序列表中的問題; 程序崩潰的行在下面的代碼中籤名;任何人都知道我錯在哪裏? 這裏job.h頭:建立出錯列表的第二個元素的頭部已被刪除後,重新創建一個

typedef struct 
{ 
    char stringa[DIM]; 
    unsigned int priority; 
} Job; 

下面的鏈接聲明(我知道這很奇怪,但我的教授希望這樣):

typedef struct QUEUEnode *link; 

而且這裏的牽連模塊:

#include "ordinate_list.h" 
#include <stdlib.h> 
#include <stdio.h> 

struct QUEUEnode 
{ 
    link next; 
    Job job; 
}; 

void QUEUEinit(Job); 
void QUEUEput_ordered(Job a); 
void QUEUEfind_link(link b, Job a); 
void QUEUElink(link upper, link bottom, Job a); 
void print_list_(link, int); 

link head=NULL; 
int QUEUED_nodes=0; 

void add_QUEUEnode(Job a) 
{ 
    if(QUEUED_nodes==0) 
    { 
     printf("Coda iniziallizata...\n\n"); 
     QUEUEinit(a); 
    } 
    else 
    { 
     QUEUEput_ordered(a); 
    } 
} 

void QUEUEinit(Job a) //OK 
{ 
    head = malloc(sizeof(struct QUEUEnode)); 
    head->next=NULL; 
    head->job=a; 
    QUEUED_nodes++; 
} 

void QUEUEput_ordered(Job a) 
{ 
    if(head->job.priority<=a.priority) 
    { 
     QUEUElink(NULL, head, a); 
    } 
    else 
    { 
     QUEUEfind_link(head, a); 
    } 
} 

void QUEUEfind_link(link b, Job a) 
{ 
    if(b->next==NULL) 
    { 
     QUEUElink(b, NULL, a); 

    } 
    else if((b->job.priority > a.priority) && (b->next->job.priority < a.priority)) 
    { 
     QUEUElink(b, b->next, a); 

    } 
    else QUEUEfind_link(b->next, a); 
    return; 
} 

void QUEUElink(link upper, link bottom, Job a) 
{ 
    link tmp; 
    tmp = malloc(sizeof(struct QUEUEnode)); 
    tmp->job=a; 

    if(upper==NULL) 
    { 
     tmp->next=head; 
     head=tmp; 
    } 
    else if(bottom==NULL) 
    { 
     bottom->next=tmp; 
     tmp->next=NULL; 
    } 
    else 
    { 
     upper->next=tmp; //HERE! DAMN BUG 
     tmp->next=bottom; 
    } 
    QUEUED_nodes++; 
} 

Job QUEUEget_top() 
{ 
    Job a; 
    link tmp=head; 
    a=head->job; 
    head=head->next; 
    free(tmp); 
    QUEUED_nodes--; 
    return a; 
} 

正如你可以從代碼中看到,該程序崩潰,在一個不尋常的路線。我唯一沒有嘗試過的就是改變工作的優先級,把第二個放在頭上,而不是後面。這樣做值得一試嗎?

+1

一個問題,如果底部== NULL,那麼你不應該做的自下而上>未來= TMP; – Fred 2013-05-06 18:03:49

+0

另一件事,檢查看到malloc不返回NULL。 – Fred 2013-05-06 18:06:11

+0

最後,您的代碼將簡化和更加強勁,如果你只是只傳遞該節點後(或之前,你的選擇),該新節點應該插入到QUEUElink()。 – Fred 2013-05-06 18:13:46

回答

2

嗯,你沒有提供ordinate_list.h,和你貼的代碼沒有一個main(),所以我們不可能告訴你某些問題是什麼。我可以,不過,告訴你某些東西一個問題是...在你QUEUElink()功能,您有保證的失敗就在這裏:

else if(bottom==NULL) 
{ 
    bottom->next=tmp; 
    tmp->next=NULL; 
} 

如果bottom等於NULL,我可以保證你用絕對的,完全肯定bottom->next=tmp;是不可能的,並會segfault。

+0

哦,你是對的,我沒有發佈主要,因爲主要是幾行調用另一個模塊調用這些功能的函數! :P 順便說一句謝謝:)我糾正'bottom'用'upper'這是必須要鏈接:) – 2013-05-06 18:41:51

+0

所以,你的代碼的工作現在一個之前的元素? – 2013-05-06 18:49:43

+0

是的:) [這裏](http://sdrv.ms/13nmEDv)它是如果你想檢查其他模塊! – 2013-05-06 19:00:18

相關問題