程序代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <malloc.h> #include <stdlib.h> #define LEN sizeof(Lnode) typedef struct{ float p; //系数 int e; //指数 }Polynomial; typedef struct Lnode{ Polynomial data; struct Lnode *next; }Lnode,*LinkList; LinkList InitList(){ LinkList L=(LinkList)malloc(LEN); if(L==NULL){ printf("动态空间分配失败!\n"); exit(1); } L->next=NULL; return(L); } void Insert(LinkList L,int i,int e,float p){ Lnode *pointer=L; Lnode *newpointer=(Lnode*)malloc (LEN); int count=0; if(i<1){ printf("插入位置非法!\n"); } while(pointer!=NULL&&count<i-1){ pointer=pointer->next; count++; } if(pointer==NULL){ printf("表长小于%d",i-1); } newpointer->next=pointer->next; newpointer->data.e=e; newpointer->data.p=p; pointer->next=newpointer; } void Input(int num,LinkList L){ printf("下面按指数升序输入各项\n"); for(int i=1;i<=num;i++){ int e; float p; printf("请输入第%d项的指数:",i); scanf_s("%d",&e); printf("请输入第%d项的系数:",i); scanf_s("%f",&p); Insert(L,i,e,p); } } void Add(LinkList L1,LinkList L2){ Lnode *p1=L1->next; Lnode *p2=L2->next; Lnode *newp=L1; while((p1!=NULL)&&(p2!=NULL)){ if((p1->data.e)==(p2->data.e)){ (p1->data.p)=(p1->data.p)+(p2->data.p); if(p1->data.p==0){ p1=p1->next; p2=p2->next; }else{ newp->next=p1; newp=p1; p1=p1->next; p2=p2->next; continue; } }else if((p1->data.e)<(p2->data.e)){ newp->next=p1; newp=p1; p1=p1->next; continue; }else if((p2->data.e)<(p1->data.e)){ newp->next=p2; newp=p2; p2=p2->next; continue; } } if(p1==NULL){newp->next=p2;} if(p2==NULL){newp->next=p1;} } void Traverse(LinkList L){ Lnode *p=L->next; while(p){ printf("%7.2fx^%d\n",p->data.p,p->data.e); p=p->next; } } int main(){ int m,n; LinkList L1=InitList(); printf("下面开始输入多项式Pn(X),首先请输入n:\n"); scanf("%d",&n); Input(n,L1); LinkList L2=InitList(); printf("下面开始输入多项式Qm(X),首先请输入m:\n"); scanf("%d",&m); Input(m,L2); printf("Pn(x)\n"); Traverse(L1); printf("Qm(x)\n"); Traverse(L2); printf("Result:\n"); Add(L1,L2); Traverse(L1); } |
运行截图:
实验小结
将实现操作的过程拆分成若干函数
本次实验是线性表的应用,相比前两次实验,该实验更具体、更贴近生活,但也意味着更为复杂。最开始编写程序时,我便从主程序开始写,但是写着写着,就出现了思维混乱、代码重复的错误。于是我开始复盘编写流程。发现在开始编写之前画一个流程图可能会使我对这个程序更加清晰。于是我将该程序划分为输入、计算、输出三个流程,进一步将输入细化为Pn(x)与Qn(x)的输入。并将计算流程用图形表示。最终对程序运行过程较为明朗。
区分continue和break
语句作用不同:在分支结构程序设计中用break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句;break语句可以用来从循环体内中途跳出循环体,即提前结束循环操作,接着执行循环下面的语句。continue语句是跳过循环体中剩余的语句而强制执行下一次循环操作。其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。
用法不同:在循环语句中,break语句一般都是与if语句一起使用;break语句不能用于循环语句和switch语句之外的任何其它语句中。continue语句只能用在循环语句中。一般都是与if语句一起使用。