还是C语言的指针问题。。

今天把数据结构的链表复习了一下,谁知道,竟然发现了自己对指针的了解不够透彻,下面就是我的问题代码:

#include "stdio.h"
typedef struct term{
	float coef;//系数
	int expn;//指数
	
};
typedef struct Node{
	struct term node;
	struct Node *next;
};
typedef struct Node abc;
typedef struct term abc1;
struct Node CreatPolyn(abc *P,int m);//输入m项的系数和指数,建立表示一元多项式的有序链表P
void DestroyPolyn(abc *P);//销毁一元多项式P
void PrintPolyn(abc P);//打印输出一元多项式P
int PolynLength(abc P);//返回一元多项式P中的项数
void AddPolyn(abc *Pa,abc *Pb);//完成多项式相加运算
void SubtractPolyn(abc *Pa,abc *Pb);//完成多项式相减运算
void MuitplyPolyn(abc *Pa,abc *Pb);//完成多项式相乘运算

main()
{
abc *P1,*P2; 
P1=CreatPolyn(P1,2);
P2=CreatPolyn(P2,1);
AddPolyn(P1,P2);
while(P1->next)
{
	printf("结果:\n");
	printf("系数=%f,指数=%d\n",P1->node.coef,P1->node.expn);
	P1=P1->next;
}

}

/**********************************************************************************************************************/
//******* 功能描述:                输入m项的系数和指数,建立表示一元多项式的有序链表P                         ********/
//******* 返回类型:                void												                       ********/
//*******     作者:                Yan													                       ********/
/**********************************************************************************************************************/
void CreatPolyn(abc *P,int m)
{
	int i;
	char s;
	abc1 e;
	abc *h;//生成新节点
	abc *g;//跟踪节点
	P=(abc*)malloc(sizeof(abc));
	P->next=NULL;
	e.coef=0.0;
	e.expn = -1;
	P->node.coef=e.coef;
	P->node.expn=e.expn;
	g=P;
	for(i =1;i<=m;++i)
	{
	h=(abc*)malloc(sizeof(abc));//首先创建新节点
	printf("输入不大于%d个的多项式",m);
	printf("系数,指数!");
	scanf("%f,%d",&e.coef,&e.expn);
	h->next=P->next;//插入新节点
	P->next=h;
	h->node.coef=e.coef;//节点赋值
	h->node.expn=e.expn;
	P=P->next;
	}
<span style="white-space:pre">	</span>P=g;
	
	while(g)
	{
	printf("系数=%f,指数=%d\n",g->node.coef,g->node.expn);
	g=g->next;
	}

}

/**********************************************************************************************************************/
//******* 功能描述:                完成多项式相加运算									                       ********/
//******* 返回类型:                void												                       ********/
//*******     作者:                Yan													                       ********/
/**********************************************************************************************************************/
void AddPolyn(abc *Pa,abc *Pb)
{
	abc *ha,*hb,*h;
	ha=Pa;
	hb=Pb;
	//while(ha->next&&hb->next)
	//{
	while(ha&&hb)
	{
		if(ha->node.expn==hb->node.expn)
		{
			ha->node.coef = ha->node.coef +hb->node.coef;
			ha=ha->next;
			hb=hb->next;
		}else{
			if(ha->node.expn>hb->node.expn)
			{
				h=(abc*)malloc(sizeof(abc));
				h->next=ha->next;
				ha->next=h;
				h->node.coef=ha->node.coef;
				h->node.expn=ha->node.expn;
				ha->node.coef=hb->node.coef;
				ha->node.expn=hb->node.expn;
				ha=ha->next;
				hb=hb->next;
			}else
			{	
				h=(abc*)malloc(sizeof(abc));
				h->next=ha->next;
				ha->next=h;
				h->node.coef=hb->node.coef;
				h->node.expn=hb->node.expn;
				ha=ha->next;
				hb=hb->next;
				
			}
		}//else
	}	
	//}
	
		while(hb)
		{
				h=(abc*)malloc(sizeof(abc));
				ha->next=h;
				h->node.coef=hb->node.coef;
				h->node.expn=hb->node.expn;
				h->next=NULL;
				hb=hb->next;
		}
	free(Pb);


}
本意是创建两个多项式执行相加操作的,但是在创建链表的时候,只用了一个指针进去操作,本以为只需要一个指针就可以引出完成的操作,但是函数只是进去进行了操作,链表是创建了,但是到了相加的阶段却发现没有链表可以相加,直接自动停止了。(vc++的保护措施吧)

我问题找了很久,然后有位大神问我你确定你有创建链表并且正确引出。后来他帮我分析,

CreatPolyn(abc *P,int m)里面的参数指针需要两个指针才能正确引用,如:CreatPolyn(abc **P,int m)
但是二级指针,我貌似只学过一级的,一直以为一级指针能够解决一切,毕竟在void 函数中,他能动态的解决值引出的问题。
好吧,废话不多说。现在这个是我听取大神意见修改后能执行的代码
<pre name="code" class="cpp">#include "stdio.h"
typedef struct term{
	float coef;//系数
	int expn;//指数
	
};
typedef struct Node{
	struct term node;
	struct Node *next;
};
typedef struct Node abc;
typedef struct term abc1;
void CreatPolyn(abc *P,int m);//输入m项的系数和指数,建立表示一元多项式的有序链表P
void DestroyPolyn(abc *P);//销毁一元多项式P
void PrintPolyn(abc P);//打印输出一元多项式P
int PolynLength(abc P);//返回一元多项式P中的项数
void AddPolyn(abc *Pa,abc *Pb);//完成多项式相加运算
void SubtractPolyn(abc *Pa,abc *Pb);//完成多项式相减运算
void MuitplyPolyn(abc *Pa,abc *Pb);//完成多项式相乘运算

main()
{
abc *P1,*P2; 
CreatPolyn(&P1,2);
CreatPolyn(&P2,1);
AddPolyn(P1,P2);
while(P1->next)
{
	printf("结果:\n");
	printf("系数=%f,指数=%d\n",P1->node.coef,P1->node.expn);
	P1=P1->next;
}

}

/**********************************************************************************************************************/
//******* 功能描述:                输入m项的系数和指数,建立表示一元多项式的有序链表P                         ********/
//******* 返回类型:                void												                       ********/
//*******     作者:                Yan													                       ********/
/**********************************************************************************************************************/
void CreatPolyn(abc **P,int m)
{
	int i;
	char s;
	abc1 e;
	abc *h;//生成新节点
	abc *g;//跟踪节点
	(*P)=(abc*)malloc(sizeof(abc));
	(*P)->next=NULL;
	e.coef=0.0;
	e.expn = -1;
	(*P)->node.coef=e.coef;
	(*P)->node.expn=e.expn;
	g=(*P);
	for(i =1;i<=m;++i)
	{
	h=(abc*)malloc(sizeof(abc));//首先创建新节点
	printf("输入不大于%d个的多项式",m);
	printf("系数,指数!");
	scanf("%f,%d",&e.coef,&e.expn);
	h->next=(*P)->next;//插入新节点
	(*P)->next=h;
	h->node.coef=e.coef;//节点赋值
	h->node.expn=e.expn;
	(*P)=(*P)->next;
	}
	
	
	*P = g;
	
	while(g)
	{
	printf("系数=%f,指数=%d\n",g->node.coef,g->node.expn);
	g=g->next;
	}

}

/**********************************************************************************************************************/
//******* 功能描述:                完成多项式相加运算									                       ********/
//******* 返回类型:                void												                       ********/
//*******     作者:                Yan													                       ********/
/**********************************************************************************************************************/
void AddPolyn(abc *Pa,abc *Pb)
{
	abc *ha,*hb,*h;
	ha=Pa;
	hb=Pb;
	while(ha->next&&hb->next)
	{
	while(ha&&hb)
	{
		if(ha->node.expn==hb->node.expn)
		{
			ha->node.coef = ha->node.coef +hb->node.coef;
			ha=ha->next;
			hb=hb->next;
		}else{
			if(ha->node.expn>hb->node.expn)
			{
				h=(abc*)malloc(sizeof(abc));
				h->next=ha->next;
				ha->next=h;
				h->node.coef=ha->node.coef;
				h->node.expn=ha->node.expn;
				ha->node.coef=hb->node.coef;
				ha->node.expn=hb->node.expn;
				ha=ha->next;
				hb=hb->next;
			}else
			{	
				h=(abc*)malloc(sizeof(abc));
				h->next=ha->next;
				ha->next=h;
				h->node.coef=hb->node.coef;
				h->node.expn=hb->node.expn;
				ha=ha->next;
				hb=hb->next;
				
			}
		}//else
	}	
	}
	
		while(hb)
		{
				h=(abc*)malloc(sizeof(abc));
				ha->next=h;
				h->node.coef=hb->node.coef;
				h->node.expn=hb->node.expn;
				h->next=NULL;
				hb=hb->next;
		}
	free(Pb);


}
这个程序通过VC++6.0执行后能够正确的引用新建链表,原因就出在一级指针在引入时,创建的是函数内部指针(即CreatPolyn中的)的内容,但是我们引入的 一级指针作为参数传递,可以改变外部变量的值,即一级指针所指向的内容,但是却无法改变指针本身(此话引用了参考文章),所以我们需要对指针的地址进行操作重新赋值,以便我们引入的指针能够指向函数创建的内部指针的地址。所以通过二级指针,我们分析下代码
 
<span style="font-family:Open Sans, verdana, ms song, Arial, Helvetica, sans-serif;color:#4d4e53;"><span style="font-size: 14px; line-height: 21px;"></span></span><pre name="code" class="cpp">void CreatPolyn(abc **P,int m)
{
	int i;
	char s;
	abc1 e;
	abc *h;//生成新节点
	abc *g;//跟踪节点
	(*P)=(abc*)malloc(sizeof(abc));
	(*P)->next=NULL;
	e.coef=0.0;
	e.expn = -1;
	(*P)->node.coef=e.coef;
	(*P)->node.expn=e.expn;
	g=(*P);
	for(i =1;i<=m;++i)
	{
	h=(abc*)malloc(sizeof(abc));//首先创建新节点
	printf("输入不大于%d个的多项式",m);
	printf("系数,指数!");
	scanf("%f,%d",&e.coef,&e.expn);
	h->next=(*P)->next;//插入新节点
	(*P)->next=h;
	h->node.coef=e.coef;//节点赋值
	h->node.expn=e.expn;
	(*P)=(*P)->next;
	}
	
	
	*P = g;
	
	while(g)
	{
	printf("系数=%f,指数=%d\n",g->node.coef,g->node.expn);
	g=g->next;
	}

}

我们对*p进行操作,由于*p是函数内部创建的指针地址值,所以函数可以正确引出链表。
 
<span style="font-family:Open Sans, verdana, ms song, Arial, Helvetica, sans-serif;color:#4d4e53;"><span style="font-size: 14px; line-height: 21px;">PS:看下参考文章我们可以知道,因为一级指针直接引用地址就可以进行对内容的修改,那么我们引用二级指针的时候便是对指针地址值的修改。
</span></span>
这个是我学习到的二级指针的问题,可能不够深入,希望大家能够指正其中需要注意的地方!
</pre><pre name="code" class="cpp">
</pre><pre name="code" class="cpp">参考文章:http://www.fenesky.com/blog/2014/07/03/pointers-to-pointers.html

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值