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;
}

コードからわかるように、プログラムは異常な行でクラッシュします。私が試したことのない唯一のことは、ジョブの優先度を変更することです。試してみる価値はありますか?

4

1 に答える 1

2

さて、あなたは ordinate_list.h を提供しておらず、投稿されたコードには main() が含まれていないため、問題が何であるかを確実に伝えることはできません。ただし、問題が何であるかを確実に伝えることができますQUEUElink()...関数では、ここで保証された失敗があります。

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

bottomが に等しい場合NULL、私はあなたに絶対的で完全な確実性を保証できますが、これbottom->next=tmp;は不可能であり、セグメンテーション違反を引き起こします。

于 2013-05-06T18:06:01.277 に答える