A. C++設計:一元多項式相加
#include<iostream.h>
#include<malloc.h>
#define len sizeof(LNode)
typedef struct Lnode //結點結構聲明
{ int nf; // 多項式系數
int ne; //多項式冪指數
struct LNode *next;
}LNode;
typedef LNode *Pol;
LNode *creat(void) //創建多項式函數
{ LNode *head,*q;
LNode *n;
head=q=n=(LNode *)malloc(len);
q->next=NULL;
do{n=(LNode *)malloc(len);
cin>>n->ne>>n->nf;
q->next=n;
q=n;}while(n->nf!=0||n->ne!=0);
q->next=NULL;
return head;}
LNode *output(LNode *head) //輸出多項式的函數
{LNode *p;
p=head->next;int n=0;
if(p->nf==0&&p->ne==0) {cout<<"0";return 0;}
else do{if(p->nf!=0)
{if(n==0)
{if(p->ne==0) {cout<<p->nf;break;}
else{cout<<p->nf<<"X"<<p->ne;n++;p=p->next;}}
else {if(p->ne==0) {if(p->nf<0)cout<<p->nf;else cout<<"+"<<p->nf;break;}
else if(p->nf<0) {cout<<p->nf<<"X"<<p->ne;p=p->next;}
else {cout<<"+"<<p->nf<<"X"<<p->ne;p=p->next;}}}
else p=p->next;}while(p->nf!=0||p->ne!=0);
if(n==0&&p->nf==0&&p->ne==0) {cout<<"0";return 0;}
return 0;}
LNode * add(Pol &Pa,Pol &Pb)//兩個多項式相加的函數
{LNode *p1,*p2,*p,*pr,*p0;
p1=Pa->next;p2=Pb->next;
p0=pr=Pa;
while(p1->next!=NULL||p2->next!=NULL)
{if(p1->ne>p2->ne)
{pr=p1;p1=p1->next;}
else if(p1->ne==p2->ne)
{p1->nf=p1->nf+p2->nf;p2=p2->next;}
else {pr->next=p2;p2=p2->next; pr=pr->next;pr->next=p1;}
if(p1->ne==0&&p2->next==NULL) break;}
p1->next=p2;
return p0;
}
void main()//主函數
{char y;
for(;;){Pol p1,p2,p3;
cout<<"input ha"<<endl;
p1=creat(); //建立多項式HA
cout<<"input hb"<<endl;
p2=creat(); //建立多項式HB
cout<<"ha=";*output(p1);cout<<endl;//輸出多項式HA
cout<<"hb=";*output(p2);cout<<endl; //輸出多項式HB
p3=add(p1,p2); //多項式HA與HB相加
cout<<"ha+hb=";*output(p3);cout<<endl; 輸出多項式HC
cout<<"ARE YOU CONTINUE?(Y|N)"<<endl;
cin>>y;
if(y=='n') break;}
B. 「一元多項式的表示和相加」數據結構,相關疑問
不會的,因為每個鏈表每個節點都是一個指針結構
DelFirst()函數是刪除當前鏈表元素。
舉個例子
鏈表節點的定義:
struct node
{
int val;
node *next;
};
int DeleteElement(node **head, node *deleteMe)
{
node *elem = *head;
if (deleteMe == *head)
{
*head = elem -> next;
free(deleteMe);
return 1;
}
while (elem != NULL)
{
if (elem -> next == deleteMe)//不要誤寫為elem
{
elem -> next = deleteMe -> next; //這里連接鏈表,鏈表不會斷開
free(deleteMe);
return 1;
}
elem = elem -> next;
}
return 0;
}
C. 一元多項式的相加
#include "stdafx.h"
#include<stdio.h>
#include<malloc.h>
typedef struct student
{
int coef;
int expn;
struct student *next;
}
plinknode;
plinknode *creat(void)
{
plinknode *head,*p1,*p2,*p3,*p4;
int m,n;
printf("gongyoujiedianshu:");
scanf("%d",&m);
p3=(plinknode *)malloc(sizeof(plinknode));
p3->coef=0;
p3->expn=-1;
p4=p3;
head=p3;
for(n=1;n<=m;n++)
{
p3=(plinknode *)malloc(sizeof(plinknode));
printf("shu,xishu:");
scanf("%d%d",&p3->coef,&p3->expn);
if(p4->expn<p3->expn)
{
p4->next=p3;
p3->next=NULL;
p4=p4->next;
}
else
{
p1=head;p2=p1->next;
while(p2)
{
if(p2->expn==p3->expn)
{
p2->coef=p2->coef+p3->coef;
free(p3);
if(p2->coef==0)
{
p1->next=p2->next;
free(p2);
if(p2->next==NULL)
{
p4=p1;
}
}
break;
}
if(p2->expn>p3->expn)
{
p1->next=p3;
p3->next=p2;
break;
}
p1=p1->next;
p2=p2->next;
}
}
}
return (head);
}
void print(plinknode *p)
{
plinknode *head;
head=p;
printf("shuchude shi:");
do
{
printf("%d%d\n",head->coef,head->expn);
head=head->next;
}while(head!=NULL);
}
plinknode *add(plinknode *a,plinknode *b)
{
plinknode *head,*p1,*p2,*p3,*p4;
p1=a;
head=a;
p3=b->next;
do
{
p2=p1->next;
if(p2->expn>p3->expn)
{
p1->next=p3;
p4=p3->next;
p3->next=p2;
p3=p4;
p1=p1->next;
}
else if(p2->expn==p3->expn)
{
p2->coef=p3->coef+p2->coef;
if(p2->coef==0)
{
p1->next==p2->next;
free(p2);
p4=p3->next;
free(p3);
p3=p4;
}
else
{
p1=p1->next;
p4=p3->next;
free(p3);
p3=p4;
}
}
else
p1=p1->next;
}while(p1->next!=NULL&&p3!=NULL);
if(p3!=NULL)
{
p2->next=p3;
}
return (head);
}
void main()
{
plinknode *h1,*h2,*h3;
h1=creat();
print(h1);
h2=creat();
print(h2);
h3=add(h1,h2);
print(h3);
}
可以運行,希望對你有幫助
D. 3. 一元多項式的表示和相加(鏈表,建立,相加,輸出)
用鏈表的網上有,給你個鏈接,但是正確性我不能保證:
http://..com/question/80603134.html
再給你一個用數組的程序,這個我已在win-tc下調試通過。
/*
本題的一個完整的c程序如下,在win-tc和Dev-c++下調試通過。
需要說明的是這里的m,n表示x的冪分別是m-1次和n-1次,
同時p[]和q[]的各系數是從x^(m-1)和x^(n-1)到x^0前的系數,
比如px=3x^3+2x+1,qx=x^2-11x+3,那麼m=4,n=3,px和qx的系數分別為
3,0,2,1和1,-11,3
*/
/*多項式加法程序*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 50
void npadd(double p[],int m,double q[],int n,double s[])
{
int i,j;
for(i=0;i<m-n;i++)
s[i]=p[i]; /*計算各項系數*/
for (i=m-n,j=0; i<=m-1; i++,j++)
s[i]=p[i]+q[j]; /*計算各項系數*/
return;
}
double compute(double s[],int k,double x) /*計算所給多項式的值*/
{
int i;
double multip = 1,sum = 0;
for (i=0;i<k-1;i++)
multip = multip * x; /*先求出x的最高次項的值*/
for (i=0;i<=k-1;i++)
{
sum = sum + s[i] * multip; /*依次從高到低求出相對應次項的值*/
if (x!=0)
multip = multip / x;
}
return sum;
}
int main()
{
int i,j,m,n;
double px[MAX],qx[MAX],rx[MAX],x;
system("cls");
for(i=0;i<MAX;i++)
rx[i]=0;
puts("Please input two polynomials one by one");
puts("P(x)=Pm-1*x^(m-1)+Pm-2*x^(m-2)+...+P1*x+P0");
puts("Q(x)=Qn-1*x^(n-1)+Qn-2*x^(n-2)+...+Q1*x+Q0");
printf("\nPlease input m (>=1): ");
scanf("%d",&m);
printf("Please input P%d, ... P0 one by one:\n",m-1);
for(i=0;i<m;i++)
scanf("%lf",&px[i]);
printf("\nPlease input n (1=<n<=m): ");/* 為簡化程序設冪次數低的後輸入 */
scanf("%d",&n);
printf("Please input Q%d, ... Q0 one by one:\n",n-1);
for(i=0;i<n;i++)
scanf("%lf",&qx[i]);
npadd(px,m,qx,n,rx);
printf("\nThe addition of two polynomials R(x) is :\n");
for (i=m,j=0;i>=1;i--) /*逐行逐項列印出結果多項式*/
{
printf(" (%f*x^%d) ",rx[m-i],i-1);
if(i-1>0)
printf(" + ");
else
printf(" . ");
if(j==2)
{
printf("\n");
j=0;
}
else
j++;
}
printf("\n");
printf("Input the value of x: ");
scanf("%lf",&x);
printf("\nThe value of the R(%f) is: %13.7f\n",x,compute(rx,m,x));
system("pause");
return 0;
}
用數組表示的相乘的地址如下:
http://..com/question/76281392.html
E. 數據結構 一元多項式求導問題
你的測試數據為什麼是0 -1 -1啊?怎麼是三個參數啊?不是應該就兩個么?一個是系數一個是冪啊!
那這樣呢?
==============================================
#include <stdio.h>
#include <malloc.h>
typedef struct polynode
{
int c;
int e;
struct polynode *next;
} poly;
poly *creatpoly()
{
poly *p, *q, *h;
q = NULL, h = NULL;
int c;
int e;
while (e!=-1)
{
scanf("%d%d", &c, &e); /*將scanf位置改變下*/
h = (poly*)malloc(sizeof(poly));
h->c = c;
h->e = e;
h->next = NULL;
if (q == NULL)
q = h;
else
p->next = h;
p = h;
}
return q;
}
poly *qiu(poly *p)
{
poly *s;
s = p;
while (p)
{
p->c = (p->c)*(p->e);
p->e = (p->e) - 1;
p = p->next;
}
return s;
}
void print(poly *p)
{
int i = 0;
if (p->e == - 1)
{
printf("0");
i++;
}
{
while (p->next != NULL)
{
if (p->c != 0)
{
printf("%d %d ", p->c, p->e);
i++;
}
else
;
p = p->next;
}
if (p->next == NULL)
{
if (p->c != 0 && p->e > -1) /*加上約束條件p->e>-1*/
{
printf("%d %d ", p->c, p->e);
i++;
}
else
;
}
if (i == 0)
printf("0");
printf("\n");
}
}
int main()
{
poly *d, *h;
d = creatpoly();
h = qiu(d);
print(h);
getchar();
getchar();
return 0;
}
F. 數據結構,一元多項式的求和問題。
我寫的代碼寫成了兩個文件了,
這個是 多項式加法list.h
#include<malloc.h>
typedef struct node
{
int coef;
int exp;
struct node *next;
}listnode;
void creat(listnode *&L)
{
listnode *p,*q;
int coef,exp;
L=(listnode*)malloc(sizeof(listnode));
p=L;
while(scanf("%d%d",&coef,&exp)==2&&exp>=0)
{
q=(listnode*)malloc(sizeof(listnode));
q->coef=coef;
q->exp=exp;
p->next=q;
p=q;
}
p->next=NULL;
}
void print(listnode *L)
{
listnode *p;
p=L->next;
while(p!=NULL)
{
if(p->coef!=0)
{
printf("[ %d %d ] ",p->coef,p->exp);
}
p=p->next;
}
printf("\n");
}
void hebing(listnode*&L1,listnode *&L2)
{
listnode *temp=L1;
while(temp->next!=NULL)
{
temp=temp->next;
}
if(L2->next!=NULL)
{
temp->next=L2->next;
}
}
void destroy(listnode *&L)
{
listnode *p=L,*q=L->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
void sortadd(listnode *&L)
{
listnode *p,*q,*pre;
p=L->next->next;
L->next->next=NULL;
while(p!=NULL)
{
q=p->next;
pre=L;
while( pre->next!=NULL && pre->next->exp>p->exp )
{
pre=pre->next;
}
if(pre->next!=NULL&&pre->next->exp==p->exp)
{
pre->next->coef+=p->coef;
free(p);
p=q;
}
else
{
p->next=pre->next;
pre->next=p;
p=q;
}
}
}
還有個 多項式加法main
#include<stdio.h>
#include<malloc.h>
#include "list.h"
int main()
{
listnode *L1=NULL;
listnode *L2=NULL;
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
creat(L1);
creat(L2);
hebing(L1,L2);
sortadd(L1);
print(L1);
}
return 0;
}
望採納謝謝