读书人

关于链表有关问题 什么时候用2级指针

发布时间: 2012-07-31 12:33:46 作者: rapoo

关于链表问题, 什么时候用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 );
}



[解决办法]

探讨
所以在下面的createLink方法中 因为是对main函数中的*head分配内存 所以mian函数传入了head指针的地址。
因为是指针的地址, 所以createLink 方法才会用二级指针来接受?

[解决办法]
想要在函数里修改一级指针的指向,就要用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;} 

读书人网 >C语言

热点推荐