链接列表崩溃,c

时间:2011-11-01 03:36:39

标签: c linked-list

我的链接列表存在问题。我很确定这是我的指针关闭,或者我没有以正确的方式传递指针,因为我是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。我试图通过最短的时间排序列表。

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-&gt; next = NULL时出现错误,说“表达式必须具有指向类的指针类型”。尝试在头前添加*但似乎没有帮助。任何人都知道如何解决它?

3 个答案:

答案 0 :(得分:4)

你的add_process函数在这里:

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

接受传递给它的任何指针 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'ed过程。使用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
    }
}

完成后不要忘记释放malloc的内存。这最好在你的进程清理函数中完成 - 在C ++中等价的析构函数只需你手动调用它。

答案 1 :(得分:1)

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

另请记住,C不会通过引用自动更改参数。因此,如果你想改变一些东西,你必须传递指向那个东西的指针。这包括其他指针 - 因此您可能需要指向指针的指针。

答案 2 :(得分:0)

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