指针的指针的理解

	使用指针,就是为了能够修改指针所指向的东西,为了能够修改‘指针本身’,就需要传递指针的指针。
 	比如:一、为了改变char a的值,在调用函数时,你的函数就是modify(char *p);
			二、为了改变char *p,中p的值,在调用函数时,你的函数就是modify(char **p);

	这就是为什么在数据结构中常用指针的指针来创建根结点。
	
typedef struct node{
	struct node *next;
	int num;
}node;
如有这个结构,用于创建链表,创建表头有两种方式,一种是通过,函数返回链表头的地址;另一种是通过参数传递,改变原变量的内容(原变量是个地址)。

2.参数传递改变地址;

如果为node *head=NULL,这种形式,然后把head以某种形式作为参数,使得返回返回后head指向链表头节点。
void Create_head_v0(node **p)
{
	if(p==NULL)
		return;
	*p=(node *)malloc(sizeof(node));
	(*p)->next=NULL;//注意要括号。
	(*p)->num=1;	
}

void main()
{
  	node *head=NULL;
  	printf("head的地址为:%x\n",&head);
  	printf("之前head存储的地址为:%x\n",head);
  	Create_head_v0(&head);
  	printf("之后head的地址为:%x\n",&head);
  	printf("之后head存储的地址为:%x\n",head);
  	printf("num=%d\n",head->num);


3.返回地址

返回地址相当于是直接赋值。
node *head=NULL;
head=newadd.
node *Create_head_v1()
{
	node *head=	(node *)malloc(sizeof(node));
	head->next=NULL;//注意要括号。
	head->num=2;return head;
}
转载请标明出处:<a target=_blank href="http://blog.csdn.net/lin200753/article/details/29582075">http://blog.csdn.net/lin200753/article/details/29582075</a>
void main()
{
  	node *head=NULL;  	
  	head=Create_head_v1();//这里通过赋值的方式改变head的内容。
  	printf("num=%d\n",head->num);

4.按从大到小向链表中插入数据
由于可能改变表头head的内容,所以也用指针的指针。
//从大到小;
int inser3(node **nod,int val)
{
	node *newnoid=(node*)malloc(sizeof(node));
	if(newnoid==NULL)
		return -1;
	newnoid->num=val;
	newnoid->next=NULL;
	while ((*nod) != NULL) {
		if (val > (*nod)->num)
			break;
		nod = &((*nod)->next);
		
	}
	newnoid->next = *nod;
	*nod=newnoid;
	return 0;
}
/*从头到尾释放*/
void Free_node(node *head)
{
	node *pre=NULL,*cur=head;
	
	while(cur!=NULL)
	{
		pre=cur;
		cur=cur->next;
		printf("释放node->num=%d\n",pre->num);
		free(pre);
	}
	
}

void main()
{
  node *head=NULL;
   node *root=NULL;
   
    inser3(&root,5);
     inser3(&root,1);
    inser3(&root,3);
    inser3(&root,2);
    inser3(&root,1);
    head=root;
    while(root!=NULL)
   	{
    	printf("%d\n",root->num);
    	root=root->next;//此时root不指向根。
    }
   Free_node(head);    	
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值