main函数设置的是指针,初始化函数传指针导致错误
#include<stdio.h>
#include<malloc.h>
typedef struct Node{
int data;
struct Node* next;
}Node;
void InitLinkList(Node *L)
{
L=(Node*)malloc(sizeof(Node));
L->next=NULL;
}
int main()
{
Node *L;
InitLinkList(L);
}
初学者可能看上述代码觉得是对的,其实上述代码是错误的,因为初始化要改变指针L的值,可传入初始化函数的参数却是指针L本身。
这本身就是值传递和地址传递的问题,改变变量的值,函数就得传变量的地址进去,要改变指针的值,那就应该传二级指针进去。
上述代码有2种改法:
第一种
void InitLinkList(Node **L)
{
(*L)=(Node*)malloc(sizeof(Node));
(*L)->next=NULL;
}
初始化函数传二级指针:
int main()
{
Node *L;
InitLinkList(&L);
}
main函数传入指针地址;
第二种
void InitLinkList(Node *L)
{
L->next=NULL;
}
int main()
{
Node L;
InitLinkList(&L);
}
第二种非常简单了,main函数里面L直接就有了内存空间,所有的操作用一级指针就可以了。
两种方式的头插法以及展示效果:
第一种:
#include<stdio.h>
#include<malloc.h>
typedef struct Node{
int data;
struct Node* next;
}Node;
void InitLinkList(Node **L)
{
(*L)=(Node*)malloc(sizeof(Node));
(*L)->next=NULL;
}
void print(Node *L)
{ Node *p=L->next;
while(p!=NULL)
printf("%d-->",p->data),p=p->next;
printf("NULL");
}
void HeadInsert(Node *L,int x)
{
Node *p=(Node*)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next=p;
}
int main()
{
Node *L;
InitLinkList(&L);
for(int i=1;i<10;i++)
HeadInsert(L,i);
print(L);
}
9-->8-->7-->6-->5-->4-->3-->2-->1-->NULL
--------------------------------
Process exited after 0.02619 seconds with return value 0
第二种:
#include<stdio.h>
#include<malloc.h>
typedef struct Node{
int data;
struct Node* next;
}Node;
void InitLinkList(Node *L)
{
L->next=NULL;
}
void print(Node *L)
{ Node *p=L->next;
while(p!=NULL)
printf("%d-->",p->data),p=p->next;
printf("NULL");
}
void HeadInsert(Node *L,int x)
{
Node *p=(Node*)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next=p;
}
int main()
{
Node L;
InitLinkList(&L);
for(int i=1;i<10;i++)
HeadInsert(&L,i);
print(&L);
}
结果:
9-->8-->7-->6-->5-->4-->3-->2-->1-->NULL
--------------------------------
Process exited after 0.02544 seconds with return value 0