多项式加法,数组和指针解决实际问题C语言
- 格式:docx
- 大小:97.15 KB
- 文档页数:15
c语言数组求和指针1. 数组和指针在C语言中,数组和指针是非常重要的概念。
数组是一组类型相同的数据项的集合,而指针则是一种变量,用来存储另一个变量的地址。
数组和指针之间存在紧密的关系。
数组名是第一个元素的指针,也就是说,数组名等价于指向数组第一个元素的指针。
因此,我们可以使用指针来操作数组。
2. 数组求和求和是计算机程序中常见的操作之一。
在C语言中,我们可以使用数组和循环来求和。
下面是一个简单的示例,演示如何使用数组求和:```cinclude <stdio.h>int main(){int num[] = {1, 2, 3, 4, 5};int sum = 0;int i;for (i = 0; i < 5; i++) {sum += num[i];}printf("The sum of the array is %d\n", sum);return 0;}```在这个示例中,我们定义了一个名为num的数组,其中包含了5个整数。
我们使用一个循环来遍历数组中的每个元素,并将它们加起来。
最后,我们将求得的总和打印到屏幕上。
3. 指针求和除了使用数组之外,我们还可以使用指针来实现求和操作。
下面是一个简单的示例,演示如何使用指针求和:```cinclude <stdio.h>int main(){int num[] = {1, 2, 3, 4, 5};int sum = 0;int *p;for (p = num; p < num + 5; p++) {sum += *p;}printf("The sum of the array is %d\n", sum);return 0;}```在这个示例中,我们通过定义一个指向整数的指针来遍历数组。
我们使用一个循环来逐个访问数组中的元素,并累加它们的值。
由此得出的总和也将打印到屏幕上。
C语⾔实现多项式的相加本⽂实例为⼤家分享了C语⾔多项式相加的具体代码,供⼤家参考,具体内容如下包含带头节点的链表的初始化,输出:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>typedef struct Pol{int coe; // 系数int index; // 指数struct Pol *next;}Pol;int main(int argc, char *argv[]){Pol *head1 = NULL; // 第⼀个多项式Pol *head2 = NULL; // 第⼆个多项式Pol *Initiate(Pol *head1); // 声明初始化函数void Output(Pol *head); // 声明输出函数void PolAdd(Pol *head1, Pol *head2); // 声明相加函数int coe, index;char sign;Pol *p;int n = 0;// 初始化第⼀个多项式head1 = Initiate(head1);p = head1;while (1){scanf("%dx%d%c", &coe, &index, &sign);p->next = (Pol *)malloc(sizeof(Pol));p = p->next;p->coe = coe;p->index = index;p->next = NULL;if(sign == '\n')break;}printf("第⼀多项式输⼊完毕。
\n");// 初始化第⼆个多项式head2 = Initiate(head2);p = head2;while (1){scanf("%dx%d%c", &coe, &index, &sign);p->next = (Pol *)malloc(sizeof(Pol));p = p->next;p->coe = coe;p->index = index;p->next = NULL;if (sign == '\n')break;}printf("第⼆多项式输⼊完毕。
C语⾔单链表实现多项式相加本⽂实例为⼤家分享了C语⾔单链表实现多项式相加的具体代码,供⼤家参考,具体内容如下//多项式的相加和相乘#include<stdio.h>#include<stdlib.h>#pragma warning(disable:4996)//兼容scanftypedef struct node {int coef;int expon;struct node* link;}Polynode,*Polynomial;Polynomial InsertPolyLinklist(Polynomial in,Polynomial Pread) {Pread->link = in;Pread = in;in->link = NULL;return Pread;}Polynomial ReadPoly(void) {Polynomial Pread = (Polynomial)malloc(sizeof(Polynode));Pread->link = NULL;Polynomial H = Pread;int N;scanf("%d ", &N);while (N--) {Polynomial p = (Polynomial)malloc(sizeof(Polynode));scanf("%d %d", &p->coef, &p->expon);Pread= InsertPolyLinklist(p,Pread);}Polynomial F;F = H->link;free(H);return F;}void PrintPoly(Polynomial F) {while(F != NULL) {printf("%d %d ", F->coef, F->expon);F = F->link;}printf("\n");}Polynomial Add(Polynomial p1, Polynomial p2) {Polynomial t1=p1,t2=p2;Polynomial p=(Polynomial)malloc(sizeof(Polynode));p->link = NULL;Polynomial q = p;Polynomial read;while (t1&&t2) {if (t1->expon == t2->expon) {if (t1->coef + t2->coef) {t1->coef = t1->coef + t2->coef;t1->expon = t1->expon;read = t1;q->link = read;q = read;t1 = t1->link;t2 = t2->link;}}else {if (t1->expon > t2->expon){read = t1;q->link = read;q = read;t1 = t1->link;}else {if (t1->expon < t2->expon) {read = t2;q->link = read;q = read;t2 = t2->link;}}}}if (t1) {q->link = t1;}if (t2) {q->link = t2;}Polynomial F = p->link;free(p);return F;}int main(void) {Polynomial p1, p2, pp, ps;p1 = ReadPoly();PrintPoly(p1);p2 = ReadPoly();PrintPoly(p2);pp = Add(p1, p2);PrintPoly(pp);// ps = Mult(p1, p2);// PrintPoly(ps);return 0;}参考MOOC 浙⼤数据结构以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
c语言一元多项式的加法,减法,乘法的实现一元多项式是代数学中的重要概念,它由各项式的系数和幂次构成。
在C语言中,我们可以通过定义结构体来表示一元多项式,并实现加法、减法和乘法运算。
我们定义一个结构体来表示一元多项式。
结构体中包含两个成员变量,一个是整数类型的系数coeff,另一个是整数类型的幂次exp。
```ctypedef struct{int coeff; // 系数int exp; // 幂次} Polynomial;```接下来,我们可以实现一元多项式的加法运算。
加法运算的规则是将两个多项式中幂次相同的项的系数相加,若幂次不同的项,则直接将其添加到结果多项式中。
具体实现如下:```cPolynomial addPolynomial(Polynomial poly1, Polynomial poly2){Polynomial result;result.coeff = poly1.coeff + poly2.coeff;result.exp = poly1.exp;return result;}```然后,我们可以实现一元多项式的减法运算。
减法运算的规则是将被减多项式的各项的系数取相反数,然后再与减数多项式相加。
具体实现如下:```cPolynomial subtractPolynomial(Polynomial poly1, Polynomial poly2){Polynomial result;result.coeff = poly1.coeff - poly2.coeff;result.exp = poly1.exp;return result;}```我们可以实现一元多项式的乘法运算。
乘法运算的规则是将两个多项式的每一项相乘,然后将结果相加。
具体实现如下:```cPolynomial multiplyPolynomial(Polynomial poly1, Polynomialpoly2){Polynomial result;result.coeff = poly1.coeff * poly2.coeff;result.exp = poly1.exp + poly2.exp;return result;}```通过上述的实现,我们可以对一元多项式进行加法、减法和乘法运算。
数据结构C语⾔描述——⽤单链表实现多项式的相加#include <stdio.h>#include <stdlib.h>typedef DataType;typedef struct Node2{DataType xishu;DataType zhisu;struct Node2 *Next;}Node2;typedef struct Node2* PNode2;//多项式按照指数⼤⼩排序void insertNewPoint_link(PNode2 head,PNode2 qNode){PNode2 p=head;while (p->Next!=NULL){if (p->Next->zhisu>qNode->zhisu){qNode->Next=p->Next;p->Next=qNode;break;}p=p->Next;}if (p->Next==NULL){p->Next=qNode;}}//打印多项式void printLinkeLink(PNode2 head){PNode2 temp=head->Next;while (temp!=NULL){printf("%d %d",temp->xishu,temp->zhisu);printf("\n");temp=temp->Next;}}//多项式的加法计算void add_poly(Node2 *pa,Node2 *pb){Node2 *p=pa->Next;Node2 *q=pb->Next;Node2 *pre=pa;Node2 *u;while (p!=NULL&&q!=NULL){if (p->zhisu<q->zhisu){pre=p;p=p->Next;}else if(p->zhisu==q->zhisu){float x=p->xishu+q->xishu;if (x!=0){p->xishu=x;pre=p;}else{pre->Next=p->Next;//指向下⼀个结点free(p);}p=pre->Next;u=q;q=q->Next;free(u);}else{u=q->Next;q->Next=p;pre->Next=q;pre=q;q=u;}}if (q){pre->Next=q;}free(pb);}void main( ){int zhishu;float xishu;PNode2 head1=(PNode2)malloc(sizeof(struct Node2));PNode2 head2=(PNode2)malloc(sizeof(struct Node2));PNode2 tem=NULL;head1->Next=NULL;head2->Next=NULL;printf("输⼊链表⼀的系数和指数,如:3,2 以0,0结束输⼊:\n"); scanf("%f,%d",&xishu,&zhishu);while (xishu!=0||zhishu!=0){tem=(PNode2)malloc(sizeof(struct Node2));tem->xishu=xishu;tem->zhisu=zhishu;tem->Next=NULL;insertNewPoint_link(head1,tem);scanf("%f,%d",&xishu,&zhishu);}printf("链表⼀按指数升序排序后的多项式为:\n");printLinkeLink(head1);printf("\n");printf("输⼊链表⼀的系数和指数,如:3,2 以0,0结束输⼊:\n"); scanf("%f,%d",&xishu,&zhishu);while (xishu!=0||zhishu!=0){tem=(PNode2)malloc(sizeof(struct Node2));tem->xishu=xishu;tem->zhisu=zhishu;tem->Next=NULL;insertNewPoint_link(head2,tem);scanf("%f,%d",&xishu,&zhishu);}printf("链表⼆按指数升序排序后的多项式为:\n");printLinkeLink(head2);printf("\n");add_poly(head1,head2);printf("多项式相加后的结果为:\n");printLinkeLink(head1);}。
#include"stdio.h"#include"stdlib.h"#include"conio.h"typedef struct Item{double coef;//系数int expn;//指数struct Item *next;}Item,*Polyn;#define CreateItem(p) p=(Item *)malloc(sizeof(Item));#define DeleteItem(p) free((void *)p);/************************************************************/ /* 判断选择函数 *//************************************************************/ int Select(char *str){ char ch;printf("%s\n",str);printf("Input Y or N:");do{ ch=getch();}while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n');printf("\n");if(ch=='Y'||ch=='y') return(1);else return(0);}/************************************************************/ /* 插入位置定位函数 *//**************************************************************/ int InsertLocate(Polyn h,int expn,Item **p){ Item *pre,*q;pre=h;q=h->next;while(q&&q->expn<expn){ pre=q;q=q->next;}if(!q){ *p=pre;return(1);}else if(q->expn==expn){ *p=q;return(0);}else{ *p=pre;return(-1);}}/************************************************************/ /* 插入结点函数 *//************************************************************/ void insert(Item *pre,Item *p){p->next=pre->next;pre->next=p;}/************************************************************/ /* 输入多项式 */ /************************************************************/ Polyn Input(void){double coef;int expn,flag;Item *h,*p,*q,*pp;CreateItem(h);//产生头结点h->next=NULL;printf("input coef and expn(if end ,expn=-1)\n");while(1){scanf("%lf%d",&coef,&expn); //输入多项式的系数和指数if(expn==-1) break; //若指数为-,表示输入结束if(InsertLocate(h,expn,&pp))//返回值非表示插入新结点{ CreateItem(p);p->coef=coef;p->expn=expn;insert(pp,p);}else if(Select("has the same expn,Replace older value?")) pp->coef=coef; //指数相同,替换系数}return h;}/************************************************************/ /* 撤消多项式 */ /************************************************************/ void Destroy(Polyn h){Item *p=h,*q;while(p!=NULL){q=p;p=p->next;DeleteItem(q);}}/************************************************************/ /* 输出多项式 */ /************************************************************/ void Output(Polyn h,char *title){int flag=1;Item *p=h->next;printf("%s=",title);while(p){ if(flag) //表示是否是多项式的第一项{ flag=0;if(p->expn==0) printf("%.2lf",p->coef);else printf("%.2lfx^%d",p->coef,p->expn);}else{ if(p->coef>0) printf("+");if(p->expn==0) printf("%.2lf",p->coef);else printf("%.2lfx^%d",p->coef,p->expn);}p=p->next;}printf("\n");}/************************************************************//* 判断两个多项式项的关系 *//************************************************************/int ItemComp(Item x,Item y){ if(x.expn<y.expn)return(-1);else if(x.expn==y.expn)return(0);else return(1);}/************************************************************//* 两多项式多项式相加 *//************************************************************/Polyn AddPolyn(Polyn h1,Polyn h2){Item *head,*last,*pa=h1->next,*pb=h2->next,*s;CreateItem(head);head->next=NULL;last=head;while(pa&&pb){CreateItem(s);last->next=s;last=s;switch (ItemComp(*pa,*pb)){case -1:last->coef=pa->coef;last->expn=pa->expn;pa=pa->next;break;case 0:last->coef=pa->coef+pb->coef;last->expn=pa->expn;pa=pa->next;pb=pb->next;break;case 1:last->coef=pb->coef;last->expn=pb->expn;pb=pb->next;break;}}if(pa){while(pa){/*把剩余节点插入*/CreateItem(s);last->next=s;last=s;last->coef=pa->coef;last->expn=pa->expn;pa=pa->next;}} if(pb){while(pb){/*把剩余节点插入*/CreateItem(s);last->next=s;last=s;last->coef=pb->coef;last->expn=pb->expn;pb=pb->next;}} last->next=NULL;return head;}/************************************************************//* 两多项式多项式相减 *//************************************************************/Polyn SubtractPolyn(Polyn h1,Polyn h2){ Item *head,*last,*pa=h1->next,*pb=h2->next,*s;CreateItem(head);head->next=NULL;last=head;while(pa&&pb){CreateItem(s);last->next=s;last=s;switch (ItemComp(*pa,*pb)){case -1:last->coef=pa->coef;last->expn=pa->expn;pa=pa->next;break;case 0:last->coef=pa->coef-pb->coef;last->expn=pa->expn;pa=pa->next;pb=pb->next;break;case 1:last->coef=-(pb->coef);last->expn=pb->expn;pb=pb->next;break;}}if(pa){while(pa){/*把剩余节点插入*/CreateItem(s);last->next=s;last=s;last->coef=pa->coef;last->expn=pa->expn;pa=pa->next;}} if(pb){while(pb){/*把剩余节点插入*/CreateItem(s);last->next=s;last=s;last->coef=-(pb->coef);last->expn=pb->expn;pb=pb->next;}}last->next=NULL;return head;}/************************************************************//* 两多项式多项式相乘 *//************************************************************/Polyn MultPolyn(Polyn h1,Polyn h2) //两个多项式相乘{ int item,expn;Item *head,*pa,*pb=h2->next,*s,*pp;double coef;CreateItem(head);head->next=NULL;while(pb){pa=h1->next;while(pa){expn=pa->expn+pb->expn;coef=pa->coef*pb->coef;if(InsertLocate(head,expn,&pp)){CreateItem(s);s->coef=coef;s->expn=expn;insert(pp,s);}elsepp->coef=pp->coef+pa->coef;pa=pa->next;}pb=pb->next;}return head;}/************************************************************//* 菜单选择 *//************************************************************/int menu(void){ int num;system("cls");printf("%20c1--create P(x)\n",' ');printf("%20c2--create Q(x)\n",' ');printf("%20c3--p(x)+Q(x)\n",' ');printf("%20c4--P(x)-Q(x)\n",' ');printf("%20c5--p(x)*Q(x)\n",' ');printf("%20c6--print P(x)\n",' ');printf("%20c7--print Q(x)\n",' ');printf("%20c8--print P(x)+Q(x)\n",' ');printf("%20c9--print P(x)-Q(x)\n",' ');printf("%20c10--print P(x)*Q(x)\n",' ');printf("%20c11--Quit\n",' ');printf(" please select 1,2,3,4,5,6,7,8,9,10,11:");do{scanf("%d",&num);}while(num<1 || num>11);return(num);}/************************************************************//* 判断多项式是否存在 *//************************************************************/int PolynNotEmpty(Polyn h,char *p){ if(h==NULL){ printf("%s is not exist!\n",p);getchar();return(0);}else return(1);}/************************************************************//* 主函数 *//************************************************************/ void main(){ int num;Polyn h1=NULL; //指向p(x) 指针Polyn h2=NULL; //指向Q(x) 指针Polyn h3=NULL; //指向P(x)+Q(x) 指针Polyn h4=NULL; //指向P(x)-Q(x) 指针Polyn h5=NULL; //指向P(x)*Q(x) 指针while(1){ num=menu();getchar();switch(num){case 1: //输入第一个多项式,若多项式存在,首先撤消然后再输入if(h1!=NULL){ if(Select("P(x) is not Empty,Create P(x) again?")) { Destroy(h1);h1=Input();}}else h1=Input();break;case 2: //输入第二个多项式,若多项式存在,首先撤消然后再输入if(h2!=NULL){ if(Select("Q(x) is not Empty,Create Q(x) again?")) { Destroy(h2);h2=Input();}}else h2=Input();break;case 3: //两多项式相加if(PolynNotEmpty(h1,"p(x)")&&PolynNotEmpty(h2,"Q(X)"))//判断俩多项式都非空 {h3=AddPolyn(h1,h2);Output(h3,"P(x)+Q(X)");printf("P(x)+Q(x) has finished!\n");getchar();}break;case 4: //两多项式相减if(PolynNotEmpty(h1,"p(x)")&&PolynNotEmpty(h2,"Q(X)")){ h4=SubtractPolyn(h1,h2);Output(h4,"P(x)-Q(x)");printf("P(x)-Q(x) has finished!\n");getchar();}break;case 5: //两多项式相乘if(PolynNotEmpty(h1,"p(x)")&&PolynNotEmpty(h2,"Q(X)")) { h5=MultPolyn(h1,h2);Output(h5,"P(x)*Q(x)");printf("P(x)*Q(x) has finished!\n");getchar();}break;case 6: //显示第一个多项式if(PolynNotEmpty(h1,"p(x)")){ Output(h1,"P(x)");getchar();}break;case 7: //显示第二个多项式if(PolynNotEmpty(h2,"Q(x)")){ Output(h2,"Q(x)");getchar();}break;case 8: //显示相加结果多项式if(PolynNotEmpty(h3,"P(x)+Q(x)")){ Output(h3,"P(x)+Q(x)");getchar();}break;case 9: //显示相减结果多项式if(PolynNotEmpty(h4,"P(x)-Q(x)")){ Output(h4,"P(x)-Q(x)");getchar();}break;case 10: //显示相乘结果多项式if(PolynNotEmpty(h5,"P(x)*Q(x)")){ Output(h5,"P(x)*Q(x)");getchar();}break;case 11: //结束程序运行。
实现多个多项式的加法、减法、乘法发表日期:2003年7月21日出处:mfcer@ 作者:精神病人已经有293位读者读过此文/** 文件名: 1_3.c(选做题)* 实验环境: Turbo C 2.0* 完成时间: 2003年2月22日*-------------------------------------------------------------------- * 改进说明: 可以实现多个多项式的加法、减法、乘法,并且比书中算法更加* 合理. 例如: 连加a+b+c+d,连减a-b-c-d,连乘a*b*c*d.*/#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <string.h>#define TRUE 1#define FALSE 0#define POSITIVE 1#define NEGATIVE -1typedef int status;typedef struct NodeType{float fCoeff;int iExpon;struct NodeType *next;} NodeType, *LinkType;typedef LinkType polynomial;typedef polynomial *PolyPointer;status MakePolyBuff(PolyPointer *, const int);status MakeNode(polynomial *, const float, const int);void AppNodeToList(polynomial *, polynomial); /* 在链表尾追加结点 */status CreatePolyn(PolyPointer, int);status ProcStrError(const char[]); /* 检查输入的数据 */void SortPolyn(PolyPointer, int); /* 根据iExpon域对链表进行升序排序 */void DestroyBuff(PolyPointer, const int);void DestroyPolyn(polynomial);int PolynLength(const polynomial); /* 求链表的长度 */void AddProcess(PolyPointer, const int, PolyPointer, const int); void SubstractProcess(PolyPointer, const int, PolyPointer);void MultiplyProcess(PolyPointer, const int, PolyPointer);void PrintPolyn(const polynomial);void MergePolynCoeff(PolyPointer, int); /* 在有序链表中,合并同类项 */int main(void){int iCounter,iPolyNum; /* 多项式链表缓冲区中链表的个数 */PolyPointer PolyBuff = NULL; /* 用户输入的多项式链表缓冲区 */polynomial PolyAddRes = NULL, /* 存放连加结果链表 */PolySubRes = NULL, /* 存放连减结果链表 */PolyMulRes = NULL; /* 存放连乘结果链表 */char strNum[10];do{printf("请输入需要构造多项式的个数,至少2个: ");gets(strNum);iPolyNum = atoi(strNum);} while (iPolyNum < 2);MakePolyBuff(&PolyBuff, iPolyNum);CreatePolyn(PolyBuff, iPolyNum);SortPolyn(PolyBuff, iPolyNum);MergePolynCoeff(PolyBuff, iPolyNum);printf("\n打印用户输入并整合后的多项式:\n");for (iCounter = 0; iCounter < iPolyNum; iCounter++){printf("第%d个项式:\n", iCounter + 1);PrintPolyn(*(PolyBuff + iCounter));}AddProcess(PolyBuff, iPolyNum, &PolyAddRes, POSITIVE);printf("\n----------------连加结果-----------------\n");PrintPolyn(PolyAddRes);SubstractProcess(PolyBuff, iPolyNum, &PolySubRes);printf("\n----------------连减结果-----------------\n");PrintPolyn(PolySubRes);MultiplyProcess(PolyBuff, iPolyNum, &PolyMulRes);printf("\n----------------连乘结果-----------------\n");PrintPolyn(PolyMulRes);printf("\n运行完毕!\n");/* 回收资源 */DestroyBuff(PolyBuff, iPolyNum);DestroyPolyn(PolyAddRes);DestroyPolyn(PolySubRes);DestroyPolyn(PolyMulRes);getch();return 0;}status MakePolyBuff(PolyPointer *polyBuffHead, const int iPolyNum) {int iCounter;*polyBuffHead = (PolyPointer)malloc(sizeof(polynomial) * iPolyNum);if (!(*polyBuffHead)){printf("错误,内存溢出!\n");return FALSE;}for (iCounter = 0; iCounter < iPolyNum; iCounter++)*(*polyBuffHead + iCounter) = NULL;return TRUE;}status CreatePolyn(PolyPointer PolyBuff, int iPolyNum){int iCounter, iExpon;float fCoeff;char strNum[100], strTemp[64], *cpCurr, *cpCurrNum;polynomial pNewNode = NULL, pInsPos = NULL;printf("\n请输入构造多项式的系数和指数...\n");printf("输入一个多项式的方式为: 系数, 指数; ... ; 系数, 指数;\n例如: 3, 4;5, 6; 7, 8;\n");for (iCounter = 0; iCounter < iPolyNum; iCounter++){printf("\n请输入第%d个多项式:\n", iCounter + 1);gets(strNum);if(!ProcStrError(strNum)) return FALSE;cpCurr = cpCurrNum = strNum;while (*cpCurr != '\0'){if (*cpCurr == ','){strncpy(strTemp, cpCurrNum, cpCurr - cpCurrNum);strTemp[cpCurr - cpCurrNum] = '\0';fCoeff = (float)atof(strTemp);cpCurrNum = cpCurr + 1;}else if (*cpCurr == ';'){strncpy(strTemp, cpCurrNum, cpCurr - cpCurrNum); strTemp[cpCurr - cpCurrNum] = '\0';iExpon = atoi(strTemp);MakeNode(&pNewNode, fCoeff, iExpon);AppNodeToList(PolyBuff + iCounter, pNewNode);cpCurrNum = cpCurr + 1;}cpCurr++;}}return TRUE;}status MakeNode(LinkType *pp, const float coeff, const int expon) {if (!(*pp = (LinkType)malloc(sizeof(NodeType) * 1))){printf("Error, the memory is overflow!\n");return FALSE;}(*pp)->fCoeff = coeff;(*pp)->iExpon = expon;(*pp)->next = NULL;return TRUE;}void AppNodeToList(polynomial *pHead, polynomial pNewNode){static polynomial pCurrNode;if (!(*pHead))(*pHead) = pCurrNode = pNewNode;else{pCurrNode->next = pNewNode;pCurrNode = pCurrNode->next;}}void SortPolyn(PolyPointer PolyBuff, int iPolyNum){int iCounter;polynomial pTemp, pTempCurrNode, /* 临时链表 */pPrevMinExp, pCurrMinExp,/* 指向最小iExpon结点的指针 */ pCurrNode, pPrevNode;for (iCounter = 0; iCounter < iPolyNum; iCounter++){pTemp = NULL;while (*(PolyBuff + iCounter) != NULL){pPrevNode = pPrevMinExp = pCurrMinExp =*(PolyBuff + iCounter);pCurrNode = (*(PolyBuff + iCounter))->next;while (pCurrNode != NULL){if (pCurrMinExp->iExpon > pCurrNode->iExpon){pPrevMinExp = pPrevNode;pCurrMinExp = pCurrNode;}pPrevNode = pCurrNode;pCurrNode = pCurrNode->next;}/* 将系数最小的结点从原链表中取出 */if (pCurrMinExp == *(PolyBuff + iCounter))*(PolyBuff + iCounter) = pPrevMinExp->next;elsepPrevMinExp->next = pCurrMinExp->next;/* 将系数最小的结点插入升序链表 */pCurrMinExp->next = NULL;if (!pTemp)pTemp = pTempCurrNode = pCurrMinExp;else{pTempCurrNode->next = pCurrMinExp;pTempCurrNode = pTempCurrNode->next;}}*(PolyBuff + iCounter) = pTemp;}}void MergePolynCoeff(PolyPointer PolyBuff, int iPolyNum){int iCounter;float MergeCoeffRes = 0;polynomial TempList, ResList = NULL, pCurrNode, pPreNode,pNewNode = NULL;for (iCounter = 0; iCounter < iPolyNum; iCounter++){pPreNode = TempList= *(PolyBuff + iCounter);MergeCoeffRes = pPreNode->fCoeff;pCurrNode = (*(PolyBuff + iCounter))->next;while (pCurrNode != NULL){while ((pCurrNode != NULL) &&(pCurrNode->iExpon == pPreNode->iExpon)){MergeCoeffRes += pCurrNode->fCoeff;pPreNode = pCurrNode;pCurrNode = pCurrNode->next;}/* 在ResList中加入新结点 */if (MergeCoeffRes != 0){MakeNode(&pNewNode, MergeCoeffRes, pPreNode->iExpon); AppNodeToList(&ResList, pNewNode);MergeCoeffRes = 0;}pPreNode = pCurrNode;}DestroyPolyn(TempList);*(PolyBuff + iCounter) = ResList;ResList = NULL;}}void AddProcess(PolyPointer polyBuff, const int iPolyNum,PolyPointer pResult, const int iSign){int iCounter;float fCoeffRes;polynomial pNewNode, pCurrNode_1, pCurrNode_2,pDelList = NULL, /* 下次要删除的中间结果链表 */pResList = NULL; /* 中间结果链表 */pCurrNode_1 = *(polyBuff);for (iCounter = 1; iCounter < iPolyNum; iCounter++){pCurrNode_2 = *(polyBuff + iCounter);while (pCurrNode_1 != NULL && pCurrNode_2 != NULL){if (pCurrNode_1->iExpon == pCurrNode_2->iExpon){fCoeffRes = 0;fCoeffRes = pCurrNode_1->fCoeff +iSign * pCurrNode_2->fCoeff;if (fCoeffRes != 0){MakeNode(&pNewNode, fCoeffRes,pCurrNode_1->iExpon);AppNodeToList(&pResList, pNewNode);}pCurrNode_1 = pCurrNode_1->next;pCurrNode_2 = pCurrNode_2->next;}else if (pCurrNode_1->iExpon < pCurrNode_2->iExpon) {MakeNode(&pNewNode, pCurrNode_1->fCoeff,pCurrNode_1->iExpon);AppNodeToList(&pResList, pNewNode);pCurrNode_1 = pCurrNode_1->next;}else /* 当pCurrNode_1->iExpon > pCurrNode_2->iExpon时候 */{MakeNode(&pNewNode, iSign * pCurrNode_2->fCoeff,pCurrNode_2->iExpon);AppNodeToList(&pResList, pNewNode);pCurrNode_2 = pCurrNode_2->next;}}/* 加入余下的多项式 */while (pCurrNode_1 != NULL){MakeNode(&pNewNode, pCurrNode_1->fCoeff,pCurrNode_1->iExpon);AppNodeToList(&pResList, pNewNode);pCurrNode_1 = pCurrNode_1->next;}while (pCurrNode_2 != NULL){MakeNode(&pNewNode, iSign * pCurrNode_2->fCoeff,pCurrNode_2->iExpon);AppNodeToList(&pResList, pNewNode);pCurrNode_2 = pCurrNode_2->next;}if (pDelList != NULL) DestroyPolyn(pDelList);pCurrNode_1 = pResList;pDelList = pResList;pResList = NULL;}*pResult = pCurrNode_1;}void SubstractProcess(PolyPointer polyBuff, const int iPolyNum,PolyPointer pResult){AddProcess(polyBuff, iPolyNum, pResult , NEGATIVE);}void MultiplyProcess(PolyPointer polyBuff, const int iPolyNum,PolyPointer pResult){int iCounter = 1, jCounter = 0, iLength; /* 缓冲区的长度 */PolyPointer pTempBuff = NULL; /* 存放中间结果的缓冲区 */polynomial pCurrNode_1, pCurrNode_2, pNewNode = NULL;/* 初始化 */pCurrNode_1 = polyBuff[0];iLength = PolynLength(polyBuff[0]);MakePolyBuff(&pTempBuff, iLength);while (TRUE){while (pCurrNode_1 != NULL){pCurrNode_2 = polyBuff[iCounter];while (pCurrNode_2 != NULL){MakeNode(&pNewNode,pCurrNode_1->fCoeff * pCurrNode_2->fCoeff, pCurrNode_1->iExpon + pCurrNode_2->iExpon); AppNodeToList(&pTempBuff[jCounter], pNewNode);pCurrNode_2 = pCurrNode_2->next;}jCounter++;pCurrNode_1 = pCurrNode_1->next;}/* 回收旧的中间结果 */if (pResult != NULL) DestroyPolyn(*pResult);/* 获得新的中间结果 */AddProcess(pTempBuff, iLength, pResult , POSITIVE);DestroyBuff(pTempBuff, iLength); /* 回收存中间结果的缓冲区 */jCounter = 0;if (++iCounter >= iPolyNum)break;else{iLength = PolynLength(*pResult);MakePolyBuff(&pTempBuff, iLength);pCurrNode_1 = *pResult;}}}void PrintPolyn(const polynomial polyList){polynomial pCurrNode = polyList;printf("多项式的长度为: %d\n", PolynLength(polyList));while (pCurrNode != NULL){printf("%.2fX^%d", pCurrNode->fCoeff, pCurrNode->iExpon); if (pCurrNode->next != NULL)if (pCurrNode->next->fCoeff > 0 )printf("+");pCurrNode = pCurrNode->next;}printf("\n");}int PolynLength(const polynomial polyList){int iLength = 0;polynomial pCurrNode = polyList;while (pCurrNode != NULL){pCurrNode = pCurrNode->next;iLength++;}return iLength;}void DestroyBuff(PolyPointer polyBuff, const int iPolyNum){int iCounter;for (iCounter = 0; iCounter < iPolyNum; iCounter++)DestroyPolyn(polyBuff[iCounter]);free(polyBuff);}void DestroyPolyn(polynomial polyList){polynomial pCurrNode;while (polyList != NULL){pCurrNode = polyList;polyList = polyList->next;free(pCurrNode);}}status ProcStrError(const char str[]){const char *cpCurr = str;if (!strlen(str)){printf("你没有输入数据!\n");return FALSE;}while (*cpCurr != '\0'){if (!(*cpCurr == ' ' || *cpCurr == ',' || *cpCurr == ';' || *cpCurr == '-')&& ('0' > *cpCurr || *cpCurr > '9')|| (*(cpCurr + 1) == '\0' && *cpCurr != ';')){printf("输入数据出错,请注意正确的输入方式!\n");return FALSE;}cpCurr++;}return TRUE;}。
C语言题目-多项式加法多项式加法(10分)题目内容:一个多项式可以表达为x的各次幂与系数乘积的和,比如:2x6+3x5+12x3+6x+20现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。
输入格式:总共要输入两个多项式,每个多项式的输入格式如下:每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。
第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
输出格式:从最高幂开始依次降到0幂,如:2x6+3x5+12x3-6x+20注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
输入样例:6 25 33 121 60 206 25 32 121 60 20输出样例:4x6+6x5+12x3+12x2+12x+40时间限制:500ms内存限制:32000kb代码#include <stdio.h> //此程序需要分3种情况,一、幂为0;二、幂为1;三、幂大于1int a[105],b[105];int main(){intx,y;while (~scanf("%d%d",&x,&y)){//存储第一个多项式的数据,当幂为0时停止输入a[x]=y;if (x==0) break;}while (~scanf("%d%d",&x,&y)){//存储第二个多项式的数据,当幂为0时停止输入b[x]=y;if (x==0) break;}for (int i=0;i<=100;i++)a[i]=a[i]+b[i]; //将两个多项式的系数相加保存到数组a[i]中int flag=0; //用此数来区分输出的式子是否是第一个数字,是第一个式子flag就为0,不是第一个式子flag就为1for (int i=20;i>1;i--){if (a[i]){ //系数不为0if (a[i]>0){ //系数大于0的情况if (a[i]==1){ //系数等于1的情况if (flag==0){//输出的式子是第一个式子printf("x%d",i);flag=1;}else printf("+x%d",i); //输出的式子不是第一个式子}else{ //系数大于1的情况if (flag==0){printf("%dx%d",a[i],i);flag=1;}elseprintf("+%dx%d",a[i],i);}}else{ //系数小于0的情况if (a[i]==-1)printf("-x%d",i);elseprintf("%dx%d",a[i],i);}}}if (a[1]){if (a[1]>0){if (a[1]==1){if (flag==0){printf("x");flag=1;} elseprintf("+x");}else{if (flag==0){printf("%dx",a[1]); flag=1;} elseprintf("+%dx",a[1]);}}else{if (a[1]==-1)printf("-x");elseprintf("%dx",a[1]);}}if (a[0]>0){if (flag==0){printf("%d",a[0]);flag=1;}elseprintf("+%d",a[0]);}if (a[0]<=0){printf("%d",a[0]);}printf("\n");return 0;}【下载本文档,可以自由复制内容或自由编辑修改内容,更多精彩文章,期待你的好评和关注,我将一如既往为您服务】。
中北大学数据结构课程设计说明书2011年12月20日1.设计任务概述(包括系统总体框图及功能描述)在这次的课程设计中我选择的题目是顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。
分别采用顺序结构和链式存储结构,利用多项得结果,最后得多项式中不含有重复阶项和零系数得项。
除此之外,还得分为降幂和升幂两种排序方式。
一元多项式计算器模块调用图2.本设计所采用的数据结构(如:链表、栈、树、图等)顺序存储结构和链式存储结构。
3.功能模块详细设计本程序主要分为四大模块:①主程序模块②输入模块:通过Getpolyn函数输入③输出模块(升幂降幂):PrintPolyn函数实现输出④数据处理模块(多项式的加减乘):通过一元多项式的Polynomial基本操作实现3.1 详细设计思想动态链表结构下的一元多项式的加法、减法、乘法的实现。
设有一元多项式Am(x)和Bn(x).Am(x)=A0+A1x1+A2x2+A3x3+… +AmxmBn(x)=B0+B1x1+B2x2+B3x3+… +Bnxn实现求M(x)= Am(x)+Bn(x)、M(x)= Am(x)-Bn(x)和M(x)= Am(x)×Bn(x)。
(1)输入形式和输入值范围:输入的系数为float类型,输入的幂为int类型请选择:1请输入你要运算的第一个一元多项式的项数:2请输入第1项的系数和指数:系数:1指数:1请输入第2项的系数和指数:系数:1指数:2(2)输出形式请选择:5一元多项式A为:x+x^2一元多项式B为:4x^4+5x^5+6x^6(3)程序所能达到的功能1) 首先判定多项式是否稀疏;2) 采用动态存储结构实现;3) 结果M(x)中无重复阶项和无零系数项;4) 要求输出结果的升幂和降幂两种排列情况(4)测试数据:包括正确地输入及其输出结果和含有错误的输入及其输出结果。
正确的输入:请选择:5一元多项式A为:x+x^2一元多项式B为:4x^4+5x^5+6x^6错误的输入:请输入第1项的系数和指数:系数:1指数:1请输入第2项的系数和指数:系数:2指数:1输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式请输入第1项的系数和指数:……………………….3.2 核心代码#include<stdio.h>#include<stdlib.h>typedef struct{ float coef; //系数int expn; //指数}term;typedef struct LNode{ term data; //term多项式值struct LNode *next;}LNode,*LinkList;typedef LinkList polynomail;/*比较指数*/int cmp(term a,term b){ if(a.expn>b.expn) return 1;if(a.expn==b.expn) return 0;if(a.expn<b.expn) return -1;else exit(-2);}/*又小到大排列*/void arrange1(polynomail pa){ polynomail h=pa,p,q,r;if(pa==NULL) exit(-2);for(p=pa;p->next!=NULL;p=p->next); r=p;for(h=pa;h->next!=r;)//大的沉底{ for(p=h;p->next!=r&&p!=r;p=p->next)if(cmp(p->next->data,p->next->next->data)==1){ q=p->next->next;p->next->next=q->next;q->next=p->next;p->next=q;}r=p;//r指向参与比较的最后一个,不断向前移动} }/*由大到小排序*/void arrange2(polynomail pa){ polynomail h=pa,p,q,r;if(pa==NULL) exit(-2);for(p=pa;p->next!=NULL;p=p->next); r=p;for(h=pa;h->next!=r;)//小的沉底{ for(p=h;p->next!=r&&p!=r;p=p->next)if(cmp(p->next->next->data,p->next->data)==1){ q=p->next->next;p->next->next=q->next;q->next=p->next;p->next=q;}r=p;//r指向参与比较的最后一个,不断向前移动} }/*打印多项式,求项数*/int printpolyn(polynomail P){ int i;polynomail q;if(P==NULL) printf("无项!\n");else if(P->next==NULL) printf("Y=0\n");else{ printf("该多项式为Y=");q=P->next;i=1;if(q->data.coef!=0&&q->data.expn!=0){ printf("%.2fX^%d",q->data.coef,q->data.expn); i++; } if(q->data.expn==0&&q->data.coef!=0)printf("%.2f",q->data.coef);//打印第一项q=q->next;if(q==NULL){printf("\n");return 1;}while(1)//while中,打印剩下项中系数非零的项,{ if(q->data.coef!=0&&q->data.expn!=0){ if(q->data.coef>0) printf("+");printf("%.2fX^%d",q->data.coef,q->data.expn); i++;}if(q->data.expn==0&&q->data.coef!=0){ if(q->data.coef>0) printf("+");printf("%f",q->data.coef);}q=q->next;if(q==NULL){ printf("\n"); break; }}}return 1;}/*1、创建并初始化多项式链表*/polynomail creatpolyn(polynomail P,int m){ polynomail r,q,p,s,Q;int i;P=(LNode*)malloc(sizeof(LNode));r=P;for(i=0;i<m;i++){ s=(LNode*)malloc(sizeof(LNode));printf("请输入第%d项的系数和指数:",i+1);scanf("%f%d",&s->data.coef,&s->data.expn);r->next=s; r=s;}r->next=NULL;if(P->next->next!=NULL){ for(q=P->next;q!=NULL/*&&q->next!=NULL*/;q=q->next)//合并同类项for(p=q->next,r=q;p!=NULL;)if(q->data.expn==p->data.expn){ q->data.coef=q->data.coef+p->data.coef;r->next=p->next;Q=p;p=p->next;free(Q);}else{ r=r->next;p=p->next;}}return P;}/*2、两多项式相加*/polynomail addpolyn(polynomail pa,polynomail pb){ polynomail s,newp,q,p,r;int j;p=pa->next;q=pb->next;newp=(LNode*)malloc(sizeof(LNode));r=newp;while(p&&q){ s=(LNode*)malloc(sizeof(LNode));switch(cmp(p->data,q->data)){case -1: s->data.coef=p->data.coef;s->data.expn=p->data.expn;r->next=s; r=s;p=p->next;break;case 0: s->data.coef=p->data.coef+q->data.coef;if(s->data.coef!=0.0){ s->data.expn=p->data.expn;r->next=s;r=s;}p=p->next;q=q->next;break;case 1: s->data.coef=q->data.coef;s->data.expn=q->data.expn;r->next=s; r=s;q=q->next;break;}//switch}//whilewhile(p){ s=(LNode*)malloc(sizeof(LNode));s->data.coef=p->data.coef;s->data.expn=p->data.expn;r->next=s; r=s;p=p->next;}while(q){ s=(LNode*)malloc(sizeof(LNode));s->data.coef=q->data.coef;s->data.expn=q->data.expn;r->next=s; r=s;q=q->next;}r->next=NULL;for(q=newp->next;q->next!=NULL;q=q->next)//合并同类项for(p=q;p!=NULL&&p->next!=NULL;p=p->next)if(q->data.expn==p->next->data.expn){ q->data.coef=q->data.coef+p->next->data.coef;r=p->next;p->next=p->next->next;free(r);}printf("升序1 , 降序2\n");printf("选择:");scanf("%d",&j);if(j==1) arrange1(newp);else arrange2(newp);return newp;}/*3、两多项式相减*/polynomail subpolyn(polynomail pa,polynomail pb) { polynomail s,newp,q,p,r,Q; int j;p=pa->next;q=pb->next;newp=(LNode*)malloc(sizeof(LNode));r=newp;while(p&&q){ s=(LNode*)malloc(sizeof(LNode));switch(cmp(p->data,q->data)){case -1: s->data.coef=p->data.coef;s->data.expn=p->data.expn;r->next=s; r=s;p=p->next;break;case 0: s->data.coef=p->data.coef-q->data.coef;if(s->data.coef!=0.0){ s->data.expn=p->data.expn;r->next=s;r=s;}p=p->next;q=q->next;break;case 1: s->data.coef=-q->data.coef;s->data.expn=q->data.expn;r->next=s; r=s;q=q->next;break;}//switch}//whilewhile(p){ s=(LNode*)malloc(sizeof(LNode));s->data.coef=p->data.coef;s->data.expn=p->data.expn;r->next=s; r=s;p=p->next;}while(q){ s=(LNode*)malloc(sizeof(LNode));s->data.coef=-q->data.coef;s->data.expn=q->data.expn;r->next=s; r=s;q=q->next;}r->next=NULL;if(newp->next!=NULL&&newp->next->next!=NULL)//合并同类项{ for(q=newp->next;q!=NULL;q=q->next)for(p=q->next,r=q;p!=NULL;)if(q->data.expn==p->data.expn){ q->data.coef=q->data.coef+p->data.coef;r->next=p->next;Q=p;p=p->next;free(Q); }else{ r=r->next;p=p->next; }} printf("升序1 , 降序2\n");printf("选择:");scanf("%d",&j);if(j==1) arrange1(newp);else arrange2(newp);return newp;}/*4两多项式相乘*/polynomail mulpolyn(polynomail pa,polynomail pb){ polynomail s,newp,q,p,r;int i=20,j;newp=(LNode*)malloc(sizeof(LNode));r=newp;for(p=pa->next;p!=NULL;p=p->next)for(q=pb->next;q!=NULL;q=q->next){ s=(LNode*)malloc(sizeof(LNode));s->data.coef=p->data.coef*q->data.coef;s->data.expn=p->data.expn+q->data.expn;r->next=s;r=s;}r->next=NULL;printf("升序1 , 降序2\n");printf("选择:");scanf("%d",&j);if(j==1) arrange1(newp);else arrange2(newp);for(;i!=0;i--){for(q=newp->next;q->next!=NULL;q=q->next)//合并同类项for(p=q;p!=NULL&&p->next!=NULL;p=p->next)if(q->data.expn==p->next->data.expn){ q->data.coef=q->data.coef+p->next->data.coef;r=p->next;p->next=p->next->next; free(r);}}return newp;}/*5、销毁已建立的两个多项式*/void delpolyn(polynomail pa,polynomail pb){ polynomail p,q;p=pa;while(p!=NULL){ q=p;p=p->next;free(q);}p=pb;while(p!=NULL){ q=p;p=p->next;free(q);}printf("两个多项式已经销毁\n");}void main(){ polynomail pa=NULL,pb=NULL;polynomail p,q;polynomail addp=NULL,subp=NULL,mulp=NULL;int n,m;int sign='y';printf("1、创建两个一元多项式\n");printf("2、两多项式相加得一新多项式\n");printf("3、两多项式相减得一新多项式\n");printf("4、两多项式相乘得一新多项式\n");printf("5、销毁已建立的两个多项式\n");printf("6、退出\n");printf("\n");while(sign!='n'){ printf("请选择:");scanf("%d",&n);switch(n){case 1:if(pa!=NULL){ printf("已建立两个一元多项式,请选择其他操作!");break;}printf("请输入第一个多项式:\n");printf("要输入几项:");scanf("%d",&m);while(m==0){ printf("m不能为0,请重新输入m:");scanf("%d",&m);}pa=creatpolyn(pa,m);printpolyn(pa);printf("请输入第二个多项式:\n");printf("要输入几项:");scanf("%d",&m);pb=creatpolyn(pb,m);printpolyn(pb);break;case 2:if(pa==NULL){ printf("请先创建两个一元多项式!\n");break;}addp=addpolyn(pa,pb);printpolyn(addp);break;case 3:if(pa==NULL){ printf("请先创建两个一元多项式!\n");break;}subp=subpolyn(pa,pb);printpolyn(subp);break;case 4:if(pa==NULL){ printf("请先创建两个一元多项式!\n");break;}mulp=mulpolyn(pa,pb);printpolyn(mulp);break;case 5:if(pa==NULL){ printf("请先创建两个一元多项式!\n");break;}delpolyn(pa,pb);pa=pb=NULL;break;case 6:if(addp!=NULL){ p=addp;while(p!=NULL){ q=p;p=p->next;free(q);}}if(subp!=NULL){ p=subp;while(p!=NULL){ q=p;p=p->next;free(q);}}exit(-2);}//switch}//while}……………………………3.3 程序运行结果(拷屏)程序运行后初始界面创建两个多项式两个多项式的加法、减法乘法运算以及结果以升幂和降幂形式排列4.课程设计心得、存在问题及解决方法该程序基本实现了要求的顺序结构、动态链表结构下的一元多项式的加法、减法、乘法等功能。