关于链表问题, 什么时候用2级指针, 什么时候用1级指针?
我有一个很基本的问题, 比如说一个函数B想操作函数A中的变量
那么函数A必须把这个变量的地址传入到函数B中,对么?
所以在下面的createLink方法中 因为是对main函数中的*head分配内存 所以mian函数传入了head指针的地址。
因为是指针的地址, 所以createLink 方法才会用二级指针来接受?
void main(){
Stu *head;
createLink( &head ); //在为链表开辟空间的时候要传入指针的地址 createLink函数中的参数应该是2级指针
printf("%d\n",head );
//同样的道理, 为什么在添加节点的时候不用二级指针又可以呢? 不都是在外面的函数中操作本函数的变量嘛?
//这种添加新节点的方式 难道不应该和createLink2一样失败么? 为什么又可以呢?
addNode(head, 3);
addNode(head,4);
addNode(head,5);
printf("\n");
printLink(head);
}
bool createLink(Stu **p ){
if ((*p=( struct Stu *) malloc(sizeof(Stu))) == NULL )
{
return false;
}else{
(*p)->next=NULL; // 这个条件表示 *p 所指向的节点最后一个节点
(*p)->stuNo=-1;
return true;
}
}
//这是错误方法=============================================================================
int createLink2(Stu *p ){
if ((p=( struct Stu *) malloc(sizeof(Stu))) == NULL )
{
return false;
}else{
p->next=NULL;
return true;
}
}
void addNode(Stu *p,int value ){
Stu *n; //新节点
// 经过这么一个循环 p应该是最后一个节点了
while ( p->next!=NULL )
{
p=p->next;
}
//新节点
n=( struct Stu *) malloc(sizeof(Stu));
n->stuNo=value;
strcpy(n->stuName, "str" );
n->next=NULL; // 注意这句话不能省去 // 否则会有不能引用0X.... 的报错
//连接上新节点
p->next=n;
}
void printLink(Stu *p ){
printf("==================\n" );
while ( p->next!=NULL)
{
printf("%d\n",p->stuNo );
p=p->next;
}
printf("%d\n",p->stuNo );
}