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