首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-07-31 
关于链表问题, 什么时候用2级指针, 什么时候用1级指针?我有一个很基本的问题, 比如说一个函数B想操作函数A

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

热点排行