我输入时遇到此问题。该程序将冻结,弹出窗口将打开并说“" .exe已停止工作。 "
它只是一个简单的插入和显示单链表的功能。我尝试了一切。我重写了代码并找到了另一种插入方式。我尝试了不同的编译器..它适用于turbo C,但我使用的是devC ++。
以下是代码:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#include <string.h>
typedef struct process
{
int pNum;
struct process *next;
}node;
node *create_node(node x)
{
node *temp;
temp=(node *)malloc(sizeof(node));
if(temp==NULL)
{
return 0;
}
else
{
temp->pNum=x.pNum;
temp->next=NULL;
}
return temp;
}
node *insert_node(node *head,node *last,node x)
{
node *temp;
temp=create_node(x);
if(head==NULL && head==last)
{
head=temp;
last=temp;
head->next=NULL;
last->next=NULL;
}
else
{
last->next=temp;
last=temp;
last->next=NULL;
}
return head;
}
int main()
{
node *head=NULL,*last=NULL,*temp,input;
int i,x,y,num;
printf("INPUT NUMBER: ");
scanf("%d",&num);
x=0;
y=6;
for(i=0;i<num;i++)
{
gotoxy(39,y);
scanf("%d",&input.pNum);
head=insert_node(head, last, input);
y++;
}
getch();
return 0;
}
我想我已经发现它停止工作的路线了。
在函数insert_node
第last->next=temp;
行
似乎我无法找到我做错的事。
答案 0 :(得分:2)
在您的代码中,在第一个条目后,头指针将指向新值。因为您正在分配该调用函数的返回值。但最后的价值不会受到影响。因为你把它称为价值传递。在 下次头==最后一次会失败。
它将转到else块,并且您正在访问
last->next=temp;
就像访问null
指针一样,这就是原因。如果你需要避免这种情况,你需要调用last作为参考传递。
答案 1 :(得分:2)
你需要这个:
node *insert_node(node *head, node **last, node x)
{
node *temp;
temp=create_node(x);
if(head==NULL && head== *last)
{
head=temp;
*last=temp;
head->next=NULL;
(*last)->next=NULL;
}
else
{
(*last)->next=temp;
(*last)=temp;
(*last)->next=NULL;
}
return head;
}
这样打电话:
head=insert_node(head, &last, input);
您的函数需要修改last
指针。在C值中包括指针通过值传递。因此,如果修改函数内部的函数参数,则不会修改传递给函数的参数。这就是您的计划中发生的事情。
在修改过程中,我们不会简化last
指针,但是我们传递一个指向last
指针的指针,这将允许我们修改last
的{{1}}指针功能。
简单示例:
main
将打印:
int func1(int x)
{
x = 10;
return 2;
}
int func2(int *x)
{
*x = 10;
return 2;
}
...
int x = 3;
printf ("%d\n", func1(x));
printf ("%d\n", x);
printf ("%d\n", func2(&x));
printf ("%d\n", x);