繁体   English   中英

链表崩溃,c

[英]Linked List crashing, c

我的链表有问题。 我很确定这是我的指针被关闭了,或者因为我不熟悉c而没有以正确的方式传递指针。 结构对我来说也很新,而c ++是我习惯的语言,而且差异比我所知道的还要多。 我可以立即用c ++编写此程序,但是无论如何这是我的代码。

void add_process(struct process new_process, struct process *head, struct process *current){

    new_process.next = NULL;

    if(head == NULL){
        head = &new_process;
        current = head;
        head->next = NULL;
    }
    else if(new_process.timeNeeded < head->timeNeeded){
        temp = head->next;
        head = &new_process;
        new_process.next = temp;
    }
    else{
        current = head;
        while(new_process.timeNeeded > current->timeNeeded){
            temp = current;
            current = current->next;
        }
        temp->next = &new_process;
        new_process.next = current;
    }
}

我正在将文件中的值读入进程,我当前使用的唯一一个是timeNeeded,它是一个整数。 我正在尝试在最短的时间内订购该清单。

int main(){
    FILE *readfile;
    readfile = fopen("data.txt","r");


    head = NULL;
    current = NULL;

    while(fscanf(readfile, "%s %i %i %i", 
        &new_process.processName, &new_process.arrivalTime, 
            &new_process.timeNeeded, &new_process.priority) != EOF)  {

                add_process(new_process, head, current);
      }
    current = head;

    while(current->next != NULL){
        printf("%s %i %i %i\n", new_process.processName, new_process.arrivalTime, new_process.timeNeeded, new_process.priority);
        current = current->next;
    }

    return 0;
}

程序在打印时崩溃,这不是问题。 第一个问题是我的程序每次都进入if(head == NULL)循环并将其插入。 所以head可能永远都不会改变,但我不确定如何解决,我很确定它是双重指针,但不是肯定的。 而且我也确信还有其他问题,因此,如果您能为我指明正确的方向,并且如果我做任何完全错误的事情,请告诉我。

编辑:好的,所以在添加指向head的指针后,我在head-> next = NULL时遇到错误,说“表达式必须具有指向类的指针”。 尝试在头部前添加*,但似乎无济于事。 谁知道怎么修它?

您的add_process函数在这里:

void add_process(struct process new_process, 
                 struct process *head, 
                 struct process *current)

接受您传递给by by value的任何指针。 这意味着您在while循环中调用之后:

while(fscanf(readfile, "%s %i %i %i", 
    &new_process.processName, &new_process.arrivalTime, 
    &new_process.timeNeeded, &new_process.priority) != EOF)  
{

        add_process(new_process, head, current);
}

head仍将为NULL,因为它从未更改过。 要让它实际更改头指针,而不是其他一些指针,请修改您的add_process以采用双层指针:

void add_process(struct process new_process, 
                 struct process **head, 
                 struct process *current)

您上面的代码的另一个问题是new_process参数也被值接受。 因此,这是传入的所有进程的临时副本add_process返回后, new_process 超出了作用域 现在,这意味着您的链表中有一个悬空的指针,指向无效的内存。

要解决此问题,您应该使用malloc动态分配内存,然后制作new_process的副本。 然后让您的链表指向malloc的过程。 使用malloc在堆上创建的对象将一直保留,直到被释放。

这是一个简单的示例,可以给您一个想法:

typedef struct process Process;
void add_process(Process new_process, Process **head, Process *current)
{
    Process *new_proc_copy = (Process *)malloc( sizeof(Process) );
    // now copy over the stuff from 
    // new_process over to this one
    memcpy((char *)new_proc_copy, (char *)new_proc, sizeof(Process));

    if(*head == NULL)
    {
        *head = new_process_copy;
        current = *head;
        (*head)->next = NULL;
    }
    else if(new_process.timeNeeded < head->timeNeeded)
    {
        // handle this case
    }
    else
    {
        // handle rest of your stuff
    }
}

完成后不要忘记释放已分配的内存。 这最好在您的进程清理功能中完成-C ++中的析构函数等效项只有您必须手动调用它。

似乎您没有为new_process分配空间。 不能每次都使用相同的内存-必须分配一些内存。

还请记住,C不会自动将参数更改为通过引用。 因此,如果您想更改某些内容,则必须传递一个指向该内容的指针。 这包括其他指针-因此您可能需要一个指向该指针的指针。

为了能够更改head包含的值,必须将指向 head指针传递给add_process函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM