2011-11-01 122 views
2

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

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-> next = NULL说“表达式必须有指针类类型。”试图在头部之前添加*,但似乎没有帮助。谁知道怎么修它?

回答

4

你add_process功能位置:

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

带您进入它的任何指针按值。这意味着在您在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); 
} 

头仍然是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++中的析构函数才是等价的。

+0

非常感谢,这一切都有道理,希望我能够再次得到这个。 – user1019430

+0

@ user1019430记得点赞您发现有帮助的答案。 – greatwolf

+0

是的,我试过,但我需要15代表第一,当我得到它时,我会给你投票 – user1019430

0

为了能够改变包含在head的价值,你必须在指针传递给headadd_process功能。

1

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

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

+0

是的我想问一下,我该如何分配c中的新内存。我相信我需要使用malloc,对吗? – user1019430

+0

是的malloc是最好的方式 – Hogan