我的链接列表存在问题。我很确定这是我的指针关闭,或者我没有以正确的方式传递指针,因为我是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时出现错误,说“表达式必须具有指向类的指针类型”。尝试在头前添加*但似乎没有帮助。任何人都知道如何解决它?
答案 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
函数。