单链表为什么用指向指针的指针

int a = 1, b =2;

void change(int *x)
{
	x = &b;
}

void _change(int **x)
{
	*x = &b;
}
void main()
{
	int *p = &a;
	change(p);
	cout << *p << endl;

	_change(&p);
	cout << *p << endl;

	system("pause");
}


上面的例子很好的说明了传递指针与传递指针的指针的不同;所以在创建单链表时,由于需要修改传递给调用函数的头指针的值,所以需要传递指向头指针的指针;

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
#define ElemType int  
  
typedef struct Node  
{  
  ElemType data;  
  struct Node * next; //指向下一个结点的指针  
}Node;  
typedef struct Node* Linklist; //定义Linklist为指向每个结构体的指针  
  
/*建立含有n个结点的带有头结点的链表*/  
 int creatListHead(Linklist *L,int n)  
{  
  Linklist p = NULL;  //定义一个结点  
  int i;  
  srand(time(0));       //初始化随机数种子  
  *L = (Linklist)malloc(sizeof(Node));    //创建头结点  
  if(*L==NULL)  
  {  
   printf("node head malloc fail!\n");  
   return -1;  
  }  
  (*L)->next = NULL;           //创建了一个只有头结点的单链表  
  
/*创建新的结点并依次插入*/  
  for(i=0;i<n;i++)  
 {  
   p = (Linklist)malloc(sizeof(Node)); //为每个结点分配内存空间  
   if(p==NULL)                         //检查内存是否分配成功  
   {  
     printf("node p malloc fail!\n");  
     return -1;  
   }  
   p->data = rand()%100 + 1;           //随机产生一个100之内的数  
   p->next = (*L)->next;  
   (*L)->next = p;  
 }  
  printf("finish creat linklist!\n");  
  return 0;  
}  
  
 int main()  
{  
 Linklist link = NULL;  
 if(creatListHead(&link,10)==0) //创建链表  
   printf("creat back to main sucess!\n");  
 else  
    printf("creat fail to main!\n");  
 return 0;  
}  

 1)每个链表结点,可能会发生删除插入操作,所以注定了结点结构体中的指针肯定会不断的发生变化———链表结点的定义一定要用指针来对结点进行间接访问

    2)在传入头结点指针给调用函数时,在函数的操作过程中,会给头结点分配内存空间,对其进行修改。所以我们要用指向头结点指针的指针来作为函数的参数。


  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值