㈠ 数据结构(c语言)用单链表存储一元多项式,并实现两个多项式的相加运算,怎么做
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
/*单项链表的声明*/
typedef struct PolynNode{
int coef; // 系数
int expn; // 指数
struct PolynNode *next; }PolynNode,*PolynList;
/*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/
/*指数系数一对一对输入*/ void CreatePolyn(PolynList &L,int n)
{
int i;
下载
原文档已转码为如下格式,以便移动设备查看
数据结构(c语言)用单链表存储一元多项式,并实现两个多项式的相加运算【最新】
阅读:1037次 页数:36页 2016-03-21 举报
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
/*单项链表的声明*/
typedef struct PolynNode{
int coef; // 系数
int expn; // 指数
struct PolynNode *next; }PolynNode,*PolynList;
/*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/
/*指数系数一对一对输入*/ void CreatePolyn(PolynList &L,int n)
{
int i;
PolynList p,q;
L=(PolynList)malloc(sizeof(PolynNode)); // 生成头结点
L->next=NULL;
q=L;
printf("成对输入%d个数据 ",n);
for(i=1;i<=n;i++)
{
p=(PolynList)malloc(sizeof(PolynNode));
scanf("%d%d",&p->coef,&p->expn); //指数和系数成对输入
q->next=p;
q=q->next;
}
p->next=NULL;
}
// 初始条件:单链表L已存在
// 操作结果: 依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
void PolynTraverse(PolynList L,void(*vi)(ElemType, ElemType)) {
PolynList p=L->next;
while(p)
{
vi(p->coef, p->expn);
if(p->next)
{
printf(" + "); //“+”号的输出,最后一项后面没有“+”
}
p=p->next;
}
printf(" ");
}
/*ListTraverse()调用的函数(类型要一致)*/ void visit(ElemType c, ElemType e) {
if(c != 0)
{
printf("%dX^%d",c,e); //格式化输出多项式每一项
}
}
/* 多项式相加,原理:归并 */ /* 参数:两个已经存在的多项式 */ /* 返回值:归并后新的多项式的头结点 */
PolynList MergeList(PolynList La, PolynList Lb) {
PolynList pa, pb, pc, Lc;
pa = La->next;
pb = Lb->next;
Lc = pc = La; // 用La的头结点作为Lc的头结点
while(pa&&pb)
{
if(pa->expn < pb->expn)
{
pc->next = pa; //如果指数不相等,pc指针连上指数小的结
点,
pc = pa;
pa = pa->next; //指向该结点的指针后移
}
else if (pa ->expn > pb->expn )
{
pc->next = pb; //pc指针连上指数小的结点,
pc = pb;
pb = pb->next; //指向该结点的指针后移
}
else //(pa ->expn = pb->expn )
{
pa->coef = pa->coef + pb->coef; //指数相等时,系数相加
pc->next = pa;
pc = pa;
pa = pa->next; //两指针都往后移
pb = pb->next;
}
}
pc->next = pa ? pa:pb; // 插入剩余段
return Lc;
}
void main()
{
PolynList ha,hb,hc;
printf("非递减输入多项式ha, ");
CreatePolyn(ha,5); // 正位序输入n个元素的值
printf("非递减输入多项式hb, ");
CreatePolyn(hb,5); // 正位序输入n个元素的值
㈡ 用c++数据结构单链表写一元多项式的相加 急求!!
//我以前写过C语言的
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#defineNULL0
typedefstructNODE{
floatcoef;//系数
intexpn;//指数
structNODE*next;
}NODE;
NODE*Creat(intn);
voidprint(NODE*head);
NODE*AddPolyn(NODE*head1,NODE*head2);
NODE*Delfirst(NODE*head,NODE*q);
voidInsertBefore(NODE*p1,NODE*p2);
intcompare(inta,intb);
main(){
NODE*head1,*head2,*head3;
intn1,n2;
printf("请输入你需要的多项数的数目n1:");
scanf("%d",&n1);
head1=Creat(n1);
printf("第一个多项式的显示: ");
print(head1);
printf(" 请输入你需要的多项数的数目n2:");
scanf("%d",&n2);
head2=Creat(n2);
printf(" 第二个多项式的显示: ");
print(head2);
head3=AddPolyn(head1,head2);
printf(" 合并后的多项式的显示: ");
print(head3);
printf(" ");
}
/*创建链表*/
NODE*Creat(intn){
NODE*current,*previous,*head;
inti;
head=(NODE*)malloc(sizeof(NODE));/*创建头结点*/
previous=head;
for(i=0;i<n;i++){
current=(NODE*)malloc(sizeof(NODE));
printf("请输入系数和指数:");
scanf("%f%d",¤t->coef,¤t->expn);
previous->next=current;
previous=current;
}
previous->next=NULL;
returnhead;
}
/*一元多项式的想加,总体考虑,可分qa的指数比qb小,或等于pb(如果系数相加等于0和不等于0),或大于pb里面由InsertBefore和Delfirst两个小模块组成一部分*/
NODE*AddPolyn(NODE*head1,NODE*head2){
NODE*ha,*hb,*qa,*qb;
inta,b;
floatsum;
ha=head1;/*ha和hb指向头结点*/
hb=head2;
qa=ha->next;/*qa和qb指向头结点的下一个结点*/
qb=hb->next;
while(qa&&qb){/*qa和qb均非空*/
a=qa->expn;
b=qb->expn;
switch(compare(a,b)){
case-1:/*qa->expn<qb->expn*/
ha=qa;
qa=qa->next;
break;
case0:
sum=qa->coef+qb->coef;/*系数的和*/
if(sum!=0.0){/*如果不是0.0*/
qa->coef=sum;/*改变系数*/
ha=qa;
}else{
free(Delfirst(ha,qa));
}
free(Delfirst(hb,qb));
qa=ha->next;
qb=hb->next;/*qb释放后要重新赋值*/
break;
case1:/*如果qa->expn>qb->expn*/
Delfirst(hb,qb);
InsertBefore(ha,qb);/*把qb插入到ha下一个结点之前*/
qb=hb->next;
ha=ha->next;
break;
}
}
if(qb)
ha->next=qb;/*插入剩余的pb*/
free(head2);
returnhead1;
}
/*比较*/
intcompare(inta,intb){
if(a<b)
return-1;
elseif(a>b)
return1;
else
return0;
}
/*删除结点q*/
NODE*Delfirst(NODE*p1,NODE*q){
p1->next=q->next;
return(q);
}
/*插入结点,引入结点p,可以让p插入到p2和p1之间*/
voidInsertBefore(NODE*p1,NODE*p2){
NODE*p;p=p1->next;
p1->next=p2;
p2->next=p;
}
/*打印,为了美观程序分开打印*/
voidprint(NODE*head){
NODE*current;
current=head->next;
while(current->next!=NULL){
printf("%0.f*x^%d+",current->coef,current->expn);
current=current->next;}
printf("%0.f*x^%d",current->coef,current->expn);
}
㈢ 用C语言实现数据结构的题目:一元多项式相加
注意:输入时,指数按升序输入
如: 1 1 2 2 3 3 0 0
2 2 3 3 0 0
结果:1 1 4 2 6 3
#include <stdio.h>
#include <malloc.h>
struct poly //设置结构体
{
int xi;
int ;
struct poly *next;
};
struct poly *jianli(void) //建立链表
{
struct poly *p1,*head1,*p2;
head1=(struct poly*)malloc(sizeof(poly));
p1=(struct poly*)malloc(sizeof(poly));
scanf("%d %d",&p1->xi,&p1->);
head1->next=p1;
p1->next=NULL;
while(1)
{
p2=(struct poly*)malloc(sizeof(poly));
scanf("%d %d",&p2->xi,&p2->);
if(p2->xi==0) if(p2->==0) {free(p2);break;}
p1->next=p2;
p2->next=NULL;
p1=p2;
}
return(head1);
}
struct poly *jisuan(struct poly *head1,struct poly *head2) //多项式的相加
{
struct poly *p1,*p2,*r1,*r2;
r1=head1;
p1=head1->next;
r2=p2=head2->next;
while(p1&&p2)
{
if(p1->==p2->)
{
p1->xi=(p1->xi)+(p2->xi);
p2=p2->next;
free(r2);
r2=p2;
r1=p1;
p1=p1->next;
}
else if(p1->>p2->)
{
r2->next=p1;
r1->next=r2;
p2=p2->next;
r2=p2;
}
else
if(p1-><p2->)
{
r1=p1; p1=p1->next;
}
}
if(p1) free(head2);
else {
r1->next=p2;
free(head2);
}
return(head1);
}
void print(poly *head)
{
struct poly *p;
p=head->next;
while(p)
{
printf("%d %d\t",p->xi,p->);
p=p->next;
}
}
void main()
{
struct poly *head1,*head2,*p;
printf("请输入多项式的每一项的系数与指数并以0 0为结束标志:\n");
head1=jianli();
printf("\n请输入另一个多项式的每一项的系数与指数并以0 0为结束标志:\n");
head2=jianli();
p=jisuan(head1,head2);
printf("\n合并后:\n");
print(p);
}
㈣ 多项式相加C语言实现(数据结构)
1 "stdio.h" 应该改成<stdio.h>吧!
2 typedef struct poly_node{
float coef;
int expon;
struct poly_node *link;
}; 中的 poly_node是不是应该放在最后一个上面结构体的最后一个花括号后面!只找到这两个!可能讲得不对!不要见怪!
㈤ C语言用链表实现一元多项式的相加
C语言代码:
#include"stdio.h"
#include"malloc.h"
/*链表结点结构*/
typedefstructLNode{
doublecoef;/*系数*/
intexp;/*指数*/
structLNode*next;
}LNode;
/*初始化链表*/
LNode*Init()
{
LNode*head=(LNode*)malloc(sizeof(LNode));
head->next=NULL;
returnhead;
}
/*将值为data的结点插入到head链表的最后*/
voidAddNode(LNode*head,doublecoef,intexp)
{
LNode*pre=head->next;
LNode*temp;
temp=(LNode*)malloc(sizeof(LNode));
temp->coef=coef;
temp->exp=exp;
temp->next=NULL;
if(pre==NULL)
{
head->next=temp;
return;
}
for(;pre->next!=NULL;pre=pre->next);
pre->next=temp;
}
/*输出head链表的所有结点的值*/
voidList(LNode*head)
{
LNode*curr;
printf("Allnodes:");
for(curr=head->next;curr!=NULL;curr=curr->next)
{
printf("(%lf,%d) ",curr->coef,curr->exp);
}
printf(" ");
}
/*返回head链表的所有结点的数量*/
intSize(LNode*head)
{
intlen=0;
LNode*curr;
for(curr=head->next;curr!=NULL;curr=curr->next,len++);
returnlen;
}
LNode*Add(LNode*headA,LNode*headB)
{
LNode*currA,*currB,*headC;
doublesum;
currA=headA->next;
currB=headB->next;
headC=Init();
while(currA!=NULL&&currB!=NULL)
{
if(currA->exp>currB->exp)
{
AddNode(headC,currA->coef,currA->exp);
currA=currA->next;
}
elseif(currA->exp<currB->exp)
{
AddNode(headC,currB->coef,currB->exp);
currB=currB->next;
}
else
{
sum=currA->coef+currB->coef;
if(sum!=0)
{
AddNode(headC,sum,currA->exp);
}
currA=currA->next;
currB=currB->next;
}
}
while(currA!=NULL)
{
AddNode(headC,currA->coef,currA->exp);
currA=currA->next;
}
while(currB!=NULL)
{
AddNode(headC,currB->coef,currB->exp);
currB=currB->next;
}
returnheadC;
}
voidmain()
{
LNode*headA,*headB,*headC;
headA=Init();
headB=Init();
AddNode(headA,1.0,5);
AddNode(headA,-1.0,3);
AddNode(headA,1,0);
AddNode(headB,0.5,5);
AddNode(headB,1.0,4);
AddNode(headB,1.0,3);
List(headA);
List(headB);
headC=Add(headA,headB);
List(headC);
}
运行测试:
㈥ 用数据结构(C语言版)实现一元多项式的表示及相加
每个项用一个结点来表示,每个结点包含两个成员,分别表示该项的系数和次数.如果是用链表来实现线性表,那么结点还要包含next成员.此题最好用链表来实现.
表示多项式,最好按照习惯,以次数的降序来排列各项.
相加时,就是将其中一个链表的各结点保持降序,依次插入另一个链表.如果遇到次数相同的,就合并.如果合并后系数为0,则删除该结点.
㈦ C语言数据结构的一元多项式计算
除以上功能外,还有乘法和除法的计算和导数计算呢。 这是我以前做的数据结构课程设计。希望能帮上你的忙。 #include<stdio.h> #include<malloc.h> typedef struct Polynomial{ float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial; //Polyn为结点指针类型 void Insert(Polyn p,Polyn h){ if(p->coef==0) free(p); //系数为0的话释放结点 else{ Polyn q1,q2; q1=h;q2=h->next; while(q2&&p->expn<q2->expn){ //查找插入位置 q1=q2; q2=q2->next; } if(q2&&p->expn==q2->expn){ //将指数相同相合并 q2->coef+=p->coef; free(p); if(!q2->coef){ //系数为0的话释放结点 q1->next=q2->next; free(q2); } } else{ //指数为新时将结点插入 p->next=q2; q1->next=p; } } }//Insert Polyn CreatePolyn(Polyn head,int m){//建立一个头指针为head、项数为m的一元多项式 int i; Polyn p; p=head=(Polyn)malloc(sizeof(struct Polynomial)); head->next=NULL; for(i=0;i<m;i++){ p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据 printf("请输入第%d项的系数与指数:",i+1); scanf("%f %d",&p->coef,&p->expn); Insert(p,head); //调用Insert函数插入结点 } return head; }//CreatePolyn void DestroyPolyn(Polyn p){//销毁多项式p Polyn q1,q2; q1=p->next; q2=q1->next; while(q1->next){ free(q1); q1=q2;//指针后移 q2=q2->next; } } void PrintPolyn(Polyn P){ Polyn q=P->next; int flag=1;//项数计数器 if(!q) { //若多项式为空,输出0 putchar('0'); printf("\n"); return; } while (q){ if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项 if(q->coef!=1&&q->coef!=-1){//系数非1或-1的普通情况 printf("%g",q->coef); if(q->expn==1) putchar('X'); else if(q->expn) printf("X^%d",q->expn); } else{ if(q->coef==1){ if(!q->expn) putchar('1'); else if(q->expn==1) putchar('X'); else printf("X^%d",q->expn); } if(q->coef==-1){ if(!q->expn) printf("-1"); else if(q->expn==1) printf("-X"); else printf("-X^%d",q->expn); } } q=q->next; flag++; }//while printf("\n"); }//PrintPolyn int compare(Polyn a,Polyn b){ if(a&&b){ if(!b||a->expn>b->expn) return 1; else if(!a||a->expn<b->expn) return -1; else return 0; } else if(!a&&b) return -1;//a多项式已空,但b多项式非空 else return 1;//b多项式已空,但a多项式非空 }//compare Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针 Polyn qa=pa->next; Polyn qb=pb->next; Polyn headc,hc,qc; hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点 hc->next=NULL; headc=hc; while(qa||qb){ qc=(Polyn)malloc(sizeof(struct Polynomial)); switch(compare(qa,qb)){ case 1: { qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; break; } case 0: { qc->coef=qa->coef+qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; break; } case -1: { qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; break; } }//switch if(qc->coef!=0){ qc->next=hc->next; hc->next=qc; hc=qc; } else free(qc);//当相加系数为0时,释放该结点 }//while return headc; }//AddPolyn Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针 Polyn h=pb; Polyn p=pb->next; Polyn pd; while(p){ //将pb的系数取反 p->coef*=-1; p=p->next; } pd=AddPolyn(pa,h); for(p=h->next;p;p=p->next) //恢复pb的系数 p->coef*=-1; return pd; }//SubtractPolyn float ValuePolyn(Polyn head,float x){//输入x值,计算并返回多项式的值 Polyn p; int i; float sum=0,t; for(p=head->next;p;p=p->next){ t=1; for(i=p->expn;i!=0;){ if(i<0){t/=x;i++;}//指数小于0,进行除法 else{t*=x;i--;}//指数大于0,进行乘法 } sum+=p->coef*t; } return sum; }//ValuePolyn Polyn Derivative(Polyn head){//求解并建立a的导函数多项式,并返回其头指针 Polyn q=head->next,p1,p2,hd; hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点 hd->next=NULL; while(q){ if(q->expn!=0){ //该项不是常数项时 p2=(Polyn)malloc(sizeof(struct Polynomial)); p2->coef=q->coef*q->expn; p2->expn=q->expn-1; p2->next=p1->next;//连接结点 p1->next=p2; p1=p2; } q=q->next; } return hd; }//Dervative Polyn MultiplyPolyn(Polyn pa,Polyn pb){//求解并建立多项式a*b,返回其头指针 Polyn hf,pf; Polyn qa=pa->next; Polyn qb=pb->next; hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点 hf->next=NULL; for(;qa;qa=qa->next){ for(qb=pb->next;qb;qb=qb->next){ pf=(Polyn)malloc(sizeof(struct Polynomial)); pf->coef=qa->coef*qb->coef; pf->expn=qa->expn+qb->expn; Insert(pf,hf);//调用Insert函数以合并指数相同的项 } } return hf; }//MultiplyPolyn void DevicePolyn(Polyn pa,Polyn pb){//求解并建立多项式a*b,返回其头指针 Polyn hf,pf,af,temp1,temp2,q; Polyn qa=pa->next; Polyn qb=pb->next; hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点,存储商 hf->next=NULL; pf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点,存储余数 pf->next=NULL; temp1=(Polyn)malloc(sizeof(struct Polynomial)); temp1->next=NULL; temp2=(Polyn)malloc(sizeof(struct Polynomial)); temp2->next=NULL; temp1=AddPolyn(temp1,pa); while(qa!=NULL&&qa->expn>=qb->expn){ temp2->next=(Polyn)malloc(sizeof(struct Polynomial)); temp2->next->coef=(qa->coef)/(qb->coef); temp2->next->expn=(qa->expn)-(qb->expn); Insert(temp2->next,hf); pa=SubtractPolyn(pa,MultiplyPolyn(pb,temp2)); qa=pa->next; temp2->next=NULL; } pf=SubtractPolyn(temp1,MultiplyPolyn(hf,pb)); pb=temp1; printf("商是:"); PrintPolyn(hf); printf("余数是:"); PrintPolyn(pf); }//DevicePolyn int main(){ int m,n,flag=0; float x; Polyn pa=0,pb=0,pc,pd,pe,pf;//定义各式的头指针,pa与pb在使用前付初值NULL printf("请输入a的项数:"); scanf("%d",&m); pa=CreatePolyn(pa,m);//建立多项式a printf("请输入b的项数:"); scanf("%d",&n); pb=CreatePolyn(pb,n);//建立多项式a //输出菜单 printf("**********************************************\n"); printf("操作提示:\n\t1.输出多项式a和b\n\t2.建立多项式a+b\n\t3.建立多项式a-b\n"); printf("\t4.计算多项式a在x处的值\n\t5.求多项式a的导函数\n\t6.建立多项式a*b\n"); printf("\t7.建立多项式a/b\n\t8.退出\n**********************************************\n"); for(;;flag=0){ printf("执行操作"); scanf("%d",&flag); if(flag==1){ printf("多项式a:");PrintPolyn(pa); printf("多项式b:");PrintPolyn(pb);continue; } if(flag==2){ pc=AddPolyn(pa,pb); printf("多项式a+b:");PrintPolyn(pc); DestroyPolyn(pc);continue; } if(flag==3){ pd=SubtractPolyn(pa,pb); printf("多项式a-b:");PrintPolyn(pd); DestroyPolyn(pd);continue; } if(flag==4){ printf("输入x的值:x="); scanf("%f",&x); printf("多项式a的值%g\n",ValuePolyn(pa,x));continue; } if(flag==5){ pe=Derivative(pa); printf("多项式a的导函数:");PrintPolyn(pe); DestroyPolyn(pe);continue; } if(flag==6){ pf=MultiplyPolyn(pa,pb); printf("多项式a*b:");PrintPolyn(pf); DestroyPolyn(pf);continue; } if(flag==7){ DevicePolyn(pa,pb); continue; } if(flag==8) break; if(flag<1||flag>8) printf("Error!!!\n");continue; }//for DestroyPolyn(pa); DestroyPolyn(pb); return 0; }
㈧ 求数据结构程序C语言版,计算任意两个一元多项式的加减乘法,输出结果多项式,要求实现多项式的插入和删除
struct poly
{
int cishu;//次方数
int xishu; //系数
};
/*在写加减乘除时:首先输入一个多项式其实就是一个结构体数组 每个数组元素由 次数和系数组成 排序(按照次数的大小顺序排序) 求出每个多项式的长度, 再 每个加减乘除函数里面的堆上分配一个新的结构体数组(malloc)以两者中最长的长度分配,加减乘除时先遍历长度大的再遍历长度小的 两个for循环OK!然后将剩下的再来一个循环一下剩下的没有合并同类项的,返回合并后的多项式...插入好说,删除也好说!这个代码量还有点不想写 */
typedef struct poly Polygon;
int Input(Polygon*);//输入函数返回输入多项式的长度
void sort(Polygon*);//排序
Polygon *Add(Polygon*,Polygon*);//加
Polygon* Minus(Ploygon*,Polygon*);//减
Polygon* Mul(Polygon*,Polygon*);//乘
Polygon* Div(Polygon*,Polygon*);//除
void Output(Polygon*);//输出
void Insert(Polygon*)//查入
㈨ c语言数据结构 一元多项式的加减 补齐代码
线性表的应用,给你一个头提示,主体部分自己想想怎么写吧: #include <stdio.h> #include "conio.h" #include <stdlib.h> #include "malloc.h" #define M 3//可以改变输入的多项式的项数 #define N 2 typedef struct poly *polytype; struct poly{ float coef; int exp; polytype next; }; polytype Create_Empty_Node(int ); void Input_Values(polytype ,int ); void Insert_Node(polytype ,float ,int ); void Add_Poly(polytype ,polytype ); void Sub_Poly(polytype ,polytype ); void OutPut_Results(polytype); void OutPut_Values(polytype); int Infact(int ,int);/*计算阶乘*/
㈩ 如何用C语言实现两个一元多项式的相加和相乘
没有别的好办法,你看这样行不行,不行你自己再想想吧
#include
void
main()
{
int
a1,b1,c1,d1,e1,f1,a2,b2,c2,d2,e2,f2;
printf("ax^5+bx^4+cx^3+dx^2+ex+f=0\n");
printf("请输入:a
b
c
d
e
f\n");
printf("第一个:");
scanf("%d%d%d%d%d%d",&a1,&b1,&c1,&d1,&e1,&f1);
printf("第二个:");
scanf("%d%d%d%d%d%d",&a2,&b2,&c2,&d2,&e2,&f2);
printf("两式相加后得:\n");
printf("%dx^5+%dx^4+%dx^3+%dx^2+%dx+%d=0\n",a1+a2,b1+b2,c1+c2,d1+d2,e1+e2,f1+f2);
}
由于变量太多!输出时要注意哦
希望回答对你有帮助!