正如標題宣佈,我有一個關於有序列表中的問題; 程序崩潰的行在下面的代碼中籤名;任何人都知道我錯在哪裏? 這裏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;
}
正如你可以從代碼中看到,該程序崩潰,在一個不尋常的路線。我唯一沒有嘗試過的就是改變工作的優先級,把第二個放在頭上,而不是後面。這樣做值得一試嗎?
一個問題,如果底部== NULL,那麼你不應該做的自下而上>未來= TMP; – Fred 2013-05-06 18:03:49
另一件事,檢查看到malloc不返回NULL。 – Fred 2013-05-06 18:06:11
最後,您的代碼將簡化和更加強勁,如果你只是只傳遞該節點後(或之前,你的選擇),該新節點應該插入到QUEUElink()。 – Fred 2013-05-06 18:13:46