在运行 display(( 时,程序崩溃。可能是 create(( 中存在问题。 我试过了,但我无法确定问题。我正在破坏他们的链接,但在哪里?我不知道。它是一个单链表。
节点结构为
typedef struct node{
int data;
struct node *right;
}list;
这里是创建((
void create(list *start){
int data;
printf("Input value : ");
scanf("%d",&data);
if(data==0){
start=NULL;
return;
}
else{
start=(list*)malloc(sizeof(list));
start->data=data;
create(start->right);
}
}
而 display(( 是
void display(list *start){
printf("%d",start->data);
if(start->right==NULL)return;
display(start->right);
}
首先,在函数create()
中,start
应该是list**
类型,如果你想改变应该影响调用函数main()
函数,否则它只是按值调用。
void create(list **start) {
/*some code */
}
其次,链接节点的递归逻辑是正确的,因为每次start
指向新的内存位置以及每次旧内存丢失时,节点之间都没有链接。
因此,list
类型的额外temp
指针变量。create()
函数看起来像
void create(list **start,list *new){
int data;
printf("Input value : ");
scanf("%d",&data);
if(data != 0){
new = malloc(sizeof(list));/*allocate memory */
new->data = data;/*put the data */
new->right = *start; /*new node right should be head ptr */
*(start) = new; /*update the head ptr */
create(start,new);
}
else
return;
}
从main()
这样称呼create()
int main(void) {
list *head_ptr = NULL, *temp = NULL;
create(&head_ptr,temp);
display(head_ptr);
return 0;
}
这里的问题是create()
分配新节点但丢失了指向它们的指针,这是内存泄漏的一个完美示例。
发生这种情况是因为当您将指针传递给函数时,您传递了它的值,并且本地参数只是堆栈上具有此值的东西 - 本地参数与您传递给函数的指针不同,它只有相同的值。
因此,当您分配新节点时,您使本地指针指向新节点,而不是您传递给函数的指针,当函数退出时,此本地指针不再存在,并且您丢失了对定位内存的引用 - 发生内存泄漏。
那么如何更改从函数内部传递给函数的指针呢?这很简单 - 只需将指针的地址传递给函数。 当您想要更改某个变量时,可以使指针指向其地址,然后取消引用该指针。在这里,您将执行相同的操作 - 获取指针的地址并取消引用指向它的双指针。 只需要像这样进行微小的更改:
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *right;
}list;
void create(list **start){
int data;
printf("Input value : ");
scanf("%d",&data);
if(data==0){
start=NULL;
return;
}
else{
*start=(list*)malloc(sizeof(list));
(*start)->data=data;
create(&(*start)->right);
}
}
void display(list *start){
printf("%d",start->data);
if(start->right==NULL)return;
display(start->right);
}
int main(void){
list *LIST=NULL;
create(&LIST);
display(LIST);
return 0;
}