关于链表问题, 什么时候用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 );
}
[解决办法]
[解决办法]
想要在函数里修改一级指针的指向,就要用2级指针接收,间接修改一级指针内容
只读操作,不修改一级指针的内容,就用1级指针就可以。。。。
[解决办法]
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);
}
//这是错误方法
//把createLink( &head ); 改成createLink( head );就正确了。
=============================================================================
int createLink2(Stu *p ){
if ((p=( struct Stu *) malloc(sizeof(Stu))) == NULL )
{
return false;
}else{
p->next=NULL;
return true;
}
}
一下是我粗略写的,你可以试试。
- C/C++ code
#include<stdio.h>#include<stdlib.h>typedef struct linknode{ int data; struct linknode *next;}* LNode;LNode createlink(LNode ptr){ int e; scanf("%d",&e); ptr=(LNode)malloc(sizeof(struct linknode)); if(ptr==NULL){ return NULL; } else{ ptr->data=e; ptr->next=NULL; } return ptr;}int main(){ LNode ptr1=NULL,ptr2=NULL; ptr2=createlink(ptr1); printf("%d",ptr2->data); return 0;}