还是C语言的指针问题。。
2014-11-05 16:46
204 查看
今天把数据结构的链表复习了一下,谁知道,竟然发现了自己对指针的了解不够透彻,下面就是我的问题代码:
我问题找了很久,然后有位大神问我你确定你有创建链表并且正确引出。后来他帮我分析,
我们对*p进行操作,由于*p是函数内部创建的指针地址值,所以函数可以正确引出链表。
#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= 4000 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
相关文章推荐
- f (p == NULL), if (p == 0) 还是 if(p) ?----再论空指针检测问题
- C语言之void 指针问题
- C语言野指针问题
- 转载:关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题
- 关于c语言下面求正余弦后面是弧度还是角度的问题
- C语言指针问题
- c语言初学-关于指针作为参数并改变它的值的问题
- 一道c语言指针问题!
- C语言指针问题
- 调试单片机程序中遇到的c语言指针问题
- f (p == NULL), if (p == 0) 还是 if(p) ?----再论空指针检测问题
- 杨中科老师谈C语言指针问题快速解惑
- C语言指针问题快速解惑
- c语言指针、数组问题(1)
- 今天在用c语言写一个栈,碰到不少问题,感觉到自己基础还是蛮差劲的,现在拿出来分享分享
- if (p == NULL), if (p == 0) 还是 if(p) ?--再论空指针检测问题
- C语言中关于指针,二维数组等的问题,一个有趣的发现
- c语言 函数 用指针传递参数 问题
- C语言 指针要注意的一些细节问题
- C语言、指针的指针和野指针的问题