高分求一道C语言程序 急

一元多项式加法:
有两个一元多项式P(x)和Q(x)需要相加,一类情况是项数很多,次数比较连续的情况,另一类是项数不多,但次数不连续的情况,试分别设计合理的数据结构对其进行求解。
测试数据:
(1)P(x)=(i+1)[x+x*x+x*x*x+x*x*x*x+....+x*x*x(20次幂)] Q(x)= (2i+3)[x+x*x+x*x*x+...+x*x*x(20-1次幂)]
(2)P(x)= 100x*x*x(100次幂)+28x*x*x(56次幂)-23x*x*x(11次幂)+45x Q(x)= 5x*x*x(100次幂)-58x*x*x(56次幂)-3x*x*x(12次幂)+35x*x(2次幂)
此题是数据结构老师提出来的问题.要求用C语言编写.
请高手指点.
高分追加.
越详细越多
写明思路.错误分析.

/*用两个链表来存储两个多项式,然后求和;创建的链表的每个节点包含多项式的一个项的信息:系数和指数;从前到后搜索新加入的项应该存放的位置,加入到链表中合适的位置;程序中有提示,输入项的系数是0,结束该多项式的输入*/
#include <stdio.h>
#include <malloc.h>

typedef struct node{//定义节点类型
float coef;
int expn;
struct node * next;
}PLOY;

void start()//用户选择界面
{printf("************************************\n");
printf(" 两个一元多项式的相加\n");
printf(" 北京航空航天大学 机械设计系 孙兴涛\n");
printf("************************************\n");
printf("请选择操作:\n");
printf("0.退出\n");
printf("1.两个一元多项式相加\n");
printf("2.帮助\n");
}

void notice()//用户帮助界面
{printf("********************帮助*********************\n");
printf("1.输入时只输入多项式的系数与指数,以0 0结束.\n");
printf("2.例如输入“1 1”然后回车,代表“1*X^1”\n");
}

void insert(PLOY *head,PLOY *inpt)//查找位置插入新链节程序
{PLOY *pre,*now;
int signal=0;
pre=head;//pre定义为现在的前一个链节
if(pre->next==NULL) {pre->next=inpt;}
else {now=pre->next;
while(signal==0)
{if(inpt->expn<now->expn)//当新链节小于现在的连接时向后移一个链节
{if(now->next==NULL) {now->next=inpt;signal=1;}
else {pre=now;now=pre->next;}}
else if(inpt->expn>now->expn)//如果发现比现在的链节大了就插入到这个连接的前面
{inpt->next=now;pre->next=inpt;signal=1;}
else {now->coef=now->coef+inpt->coef;signal=1;free(inpt);//与当前链节相等指数
if(now->coef==0) {pre->next=now->next;free(now);}}}}
}

PLOY * creat(char ch) //输入多项式
{PLOY *head, *inpt;
float x; int y;
head=(PLOY *)malloc(sizeof(PLOY));//创建链表头
head->next=NULL;
printf("请输入一元多项式%c:(格式:系数 指数,以0 0结束.)\n",ch);
scanf("%f %d",&x,&y);
while(x!=0)
{inpt=(PLOY *)malloc(sizeof(PLOY));//创建新链节
inpt->coef=x;
inpt->expn=y;
inpt->next=NULL;
insert(head,inpt);//不然就查找位置并且插入新链节
scanf("%f %d",&x,&y);
}
return head;
}

void addPLOY(PLOY *head,PLOY *pre)//多项式相加
{PLOY *inpt;
int flag=0;
while(flag==0)
{if(pre->next==NULL) flag=1;//当现在指向空时跳出循环
else {pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));//创建新链节
inpt->coef=pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);}//否则把当前“g(x)”的链节插入到“y(x)”中
}
}

void print(PLOY *fun)//输出多项式
{PLOY *printing;
int flag=0;
printing=fun->next;//正在被打印的链节
if(fun->next==NULL)//如果函数为空打印0
{printf("0\n"); return;}
while(flag==0)
{if(printing->coef>0&&fun->next!=printing) printf("+");//为正数时打印“+”号
if(printing->coef==1);//如果为“1”就不用打印系数了
else if(printing->coef==-1) printf("-");//如果为“-1”就打印“-”号就行了
else printf("%f",printing->coef);//其余情况都得打印
if(printing->expn!=0) printf("x^%d",printing->expn);//如果指数为“0”不打印指数项
else if((printing->coef==1)||(printing->coef==-1)) printf("1");
if(printing->next==NULL) flag=1;//如果现在的链节没有下一个就结束
else printing=printing->next;
}
printf("\n");
}

void main()
{PLOY *f,*g;
int sign=-1;//设置标志
start();
while(sign!=0)
{scanf("%d",&sign);
switch(sign)
{case 0:break;//退出
case 1:{printf("你选择的操作是多项式相加:\n");
f=creat('f');//输入多项式f(x)
printf("f(x)=");
print(f);
g=creat('g');//输入多项式g(x)
printf("g(x)=");
print(g);
printf("F(x)=f(x)+g(x)=");
addPLOY(f,g);//两个多项式相加
print(f);
sign=-1;//复位标志
start();//回复用户选择界面
break;}
case 2:{notice();
sign=-1;//复位标志
start();//回复用户选择界面
break;}
default:{printf("输入有误!请重新选择操作!\n");//选择错误,返回选择界面
start();break;}}
}
printf("谢谢使用!\n");
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-01-18
合并两个链表呗
参考一下程序 或许会有点用
#include "stdio.h"
struct student
{

int number;
int score;
struct student *next;
struct student *before; /*由于要排序,所以要建立双向链表 */
}*Head_A,*Rear_A,*Head_B,*Rear_B,*p,*p1;

void main()
{
int i,j,Length_A,Length_B,Length_Z;
printf("此程序是把a,b两个链表合并并按学号升序排列.\n");
printf("a,b两个链表中的结点包括学号、成绩。\n");
printf("先分别输入两个链表的长度.\n");

printf("请输入a链表的长度:"); /*输入链表a*/
scanf("%d",&Length_A);

printf("请输入a链表结点中的学号和成绩\n");
printf(" 学号 成绩\n");
for(i=1;i<=Length_A;i++)
{
p=(struct student*)malloc(sizeof(struct student));
printf("请输入第%d个同学的学号和成绩:",i);
scanf("%d%d",&p->number,&p->score);
p->next=NULL;
if(i==1) {Head_A=p;Rear_A=p;p->before=NULL;}
else {p->before=Rear_A;Rear_A->next=p;Rear_A=p;}
}
printf("现在将输出a链表.\n"); /*输出链表a*/
printf(" 学号 成绩\n");
p=Head_A;
for(i=1;i<=Length_A;i++)
{
printf("第%d个同学:%d %d\n",i,p->number,p->score);
p=p->next;
}
printf("请输入b链表的长度:"); /*输入链表b*/
scanf("%d",&Length_B);

printf("请输入b链表结点中的学号和成绩\n");
printf(" 学号 成绩\n");
for(i=1;i<=Length_B;i++)
{
printf("第%d个同学的学号和成绩:",i);
scanf("%d%d",&p->number,&p->score);
p->next=NULL;
if(i==1) {Head_B=p;Rear_B=p;}
else {p->before=Rear_B;Rear_B->next=p;Rear_B=p;}
}
printf("现在将输出b链表.\n"); /*输出链表b*/
printf(" 学号 成绩\n");
p=Head_A;
for(i=1;i<=Length_B;i++)
{
printf("第%d位同学的学号和成绩:%d %d\n",i,p->number,p->score);
p=p->next;
}
printf("现在将a,b链表进行合并\n"); /*合并两链表*/
Rear_A->next=Head_B; /*将b链表的头指针地址赋值给a链表的尾部*/
Rear_A=Head_B;
printf("现在输出合并后的新链表\n"); /*输出新链表*/
Length_Z=Length_A+Length_B; /*长度变为两链表之和*/
p=Head_A;

printf(" 学号 成绩\n");
for(i=1;i<=Length_Z;i++)
{
printf("第%d位同学的学号和成绩:%d %d\n",i,p->number,p->score);
p=p->next;
}
p1=(struct student*)malloc(sizeof(struct student));
printf("现在进行排序工作\n");

for(i=1;i<Length_Z;i++)
{ p=Head_A;
p->before=NULL;
p1=p->next;
for(j=1;j<=Length_Z-i;j++)
{
if(p->number>p->next->number)
{
p1=p->next;
p->next=p1->next;
p1->next->before=p1->before;
p1->next=p1->before;
if(j==1) {p->before=p1;Head_A=p1;p1->before=NULL;}
else {p1->before=p->before;p1->before->next=p1;}
p1=p->next;
}
else {p=p1;p1=p1->next;}
}
}
/*经过上面的程序,已经把顺序排好*/
printf("现在将输出已按升序排列的新链表.\n");
printf(" 学号 成绩\n");
for(i=1;i<=Length_Z;i++)
{
printf("第%d位同学的学号和成绩:%d %d\n",i,p->number,p->score);
p=p->next;
}
第2个回答  2008-01-18
次数连续的,用数组,a[i]表示i次项的系数,如果没有i此项,则a[i]=0就好了。相加的时候两个数组的对应元素相加就ok了。

次数不连续的,用链表。每个节点有两个数据,一个是系数另一个是次数。相加的时候,在第一个链表中查找第二个链表的各个项,如果第一个链表中有相应的次数项,则对应节点的数据相加,否则直接把链表2的节点插入链表1中就可以了。
第3个回答  2008-01-18
第一种:首先将输入的表达式进行按指数升序排列
然后顺序逐个相加
第二种:也是先排序,然后对每一项分别建立索引,然后用二分法搜索,找到匹配项做求和计算,没找到在相应位置插入,如此反复循环,直到所有项遍历完
第4个回答  2008-01-18
一元多项式运算(链表表示)
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LEN sizeof(node)

typedef struct polynode
{
int coef;//系数
int exp;//指数
struct polynode *next;
}node;

node * create(void)
{
node *h,*r,*s;
int c,e;
h=(node *)malloc(LEN);//头结点
r=h;
printf("coef:");
scanf("%d",&c);
printf("exp: ");
scanf("%d",&e);
while(c!=0)
{
s=(node *)malloc(LEN);
s->coef=c;
s->exp=e;
r->next=s;
r=s;
printf("coef:");
scanf("%d",&c);
printf("exp: ");
scanf("%d",&e);
}
r->next=NULL;//表尾
return(h);
}

polyadd(node *polya, node *polyb)
{
node *p,*q,*pre,*temp;
int sum;
p=polya->next;
q=polyb->next;
pre=polya;
while(p!=NULL&&q!=NULL)
{
if(p->exp<q->exp)
{
pre->next=p;pre=pre->next;
p=p->next;
}
else if(p->exp==q->exp)
{
sum=p->coef+q->coef;
if(sum!=0)
{
p->coef=sum;
pre->next=p;pre=pre->next;
p=p->next;temp=q;q=q->next;free(temp);
}
else
{temp=p->next;free(p);p=temp;
temp=q->next;free(q);q=temp;
}
}
else
{pre->next=q;pre=pre->next;
q=q->next;
}
}
if(p!=NULL)
pre->next=p;
else
pre->next=q;
}

void print(node * p)
{
while(p->next!=NULL)
{
p=p->next;
printf(" %d*x^%d",p->coef,p->exp);

}
}
main()
{
node * polya,* polyb;
printf("Welcome to use!\n");
printf("\nPlease input the ploya include coef && exp:\n");
polya=create();
print(polya);
printf("\nPlease input the ployb include coef && exp:\n");
polyb=create();
print(polyb);
printf("\nSum of the poly is:\n");
polyadd(polya,polyb);
print(polya);
printf("\n");
}
第5个回答  2008-01-19
冲这个分来滴,都不答我练练手
利用选择排序
VS2005下编译通过,LZ给分的速度

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

#define Num 4

struct player
{
char a[20];
char *name;
float points;
int rank;
};

void SelectSort(player *p, int len)
{
float tmpp;
char * tmpname;
for(int i=0; i< len; i++)
{
for(int j=i+1; j< len; j++)
{
if(p[i].points > p[j].points)
{
tmpp = p[i].points;
tmpname = p[i].name;

p[i].points = p[j].points;
p[i].name = p[j].name;

p[j].points = tmpp;
p[j].name = tmpname;

p[i].rank = i+1;
}
}//for
}//for
}

int main()
{
player ps[Num];

//输入运动员姓名、成绩
for(int i=0; i<Num; i++)
{
std::cout<<"请输入第"<<i+1<<"个运动员名称:"<<std::endl;
std::cin>>ps[i].a;
ps[i].name = ps[i].a;
std::cout<<"请输入第成绩:"<<std::endl;
std::cin>>ps[i].points;
ps[i].rank = 0;

}

//利用选择排序,排出运动员成绩
SelectSort(ps, Num);

//求平均成绩

float sum= 0.0;
for(int i=0; i<Num; i++)
{
sum += ps[i].points;
}
sum = sum/Num;

std::cout<<"冠军:"<<ps[0].name<<std::ends<<ps[0].points<<std::endl;
std::cout<<"亚军:"<<ps[1].name<<std::ends<<ps[1].points<<std::endl;
std::cout<<"季军:"<<ps[2].name<<std::ends<<ps[2].points<<std::endl;

std::cout<<"平均成绩:"<<sum<<std::endl;
}

C语言编写一个程序,急用!!高分悬赏(正确答案追加分数)
include <stdio.h> include <stdlib.h> include <conio.h> include void Menu();void Plus();void Minus();void Multiply();void Dir();int main(){ int n, flag = 0;while(1){ Menu();do { flag = 0;scanf("%d", &n);switch(n){ case 1: Plus(); break;case 2: Min...

高分求一道C语言程序 急
head->next=NULL;printf("请输入一元多项式%c:(格式:系数 指数,以0 0结束.)\\n",ch);scanf("%f %d",&x,&y);while(x!=0){inpt=(PLOY *)malloc(sizeof(PLOY));\/\/创建新链节 inpt->coef=x;inpt->expn=y;inpt->next=NULL;insert(head,inpt);\/\/不然就查找位置并且插入新链节 scanf("...

求一道题的c语言题流程图和N-s图 高分!!!急!!!
void main(){int i,j,res=0;for(i=11;i<1000;i++){ for(j=10;j<i;j++)if((j*j+168)==i*i)\/*不要一叶障目*\/ {res=1; break; } \/*找到符合条件的,打破内层循环*\/ if(res) break;\/*打破内层循环直接遇到此句,打破外层循环*\/ } printf("%d",j*j-100);} 这个用N...

c语言编程题目,很急,求程序
int changdu){*q = (struct student *)malloc(sizeof(struct student) * changdu);}\/\/输入学生信息void Input(struct student *r, int cd){int m;for

(高分求)谁能帮忙搞一个C语言编的模拟现实中一个实例的程序
include<ctype.h> main(){ for(;;){ FILE *fp;int *pa,*pb,*pc;float dd=0,sum=0,sum0=0,x_value=0,y_value=0;int i,j,p,x=0,y=0;printf("***\\n");printf("this is a programme for the Opitical Fiber length!\\n");printf("please input the x_Direction Module's n...

C语言。高分急求。高手进。(做好再加高分,编程题6题)
\/\/n为阶数,想要多少改为多少 void main(){ int a[MAX][MAX];int i,j,t;int n;puts("输入幻方的阶数:");scanf("%d",&n);\/\/将数组中所有的数都置零 for(i=0;i<n;i++){ for(j=0;j<n;j++)a[i][j]=0;} \/\/幻方阵赋值 i=0;j=n\/2;a[i][j]=1;\/\/第一行中间的数...

高分求C语言简单数学计算
int main(){ float A,B,C,D,E,F,G,SUM;do { A=0;B=0;C=0;D=0;E=0;F=0;G=0;scanf("%f,%f,%f,%f,%f,%f,%f",&A,&B,&C,&D,&E,&F,&G);SUM=1.5*A+1.2*B+1*C+1*D+0.7*E+0.5*F+0.3*G;printf("\\n%f\\n",SUM);}While(1)return 0;} 上面的程序,...

高分求编程题程序(C语言)
int c=0;while(b.tail!=0){ printf("%d",b.tail->d);c++;b.tail=b.tail->previous;} printf("\\n");printf("%d digits in total.\\n",c);} void free_memory(BigInt *b){ Digit *p;while(b->head!=0){ p=b->head->next;free(b->head);b->head=p;} b->head=0;b->...

一个有关C语言(数据结构)程序设计题 高手请帮忙,高分!
if(G.vexs[i]==c) return i;return -1;} \/\/创建无向网 void CreateUDN(MGraph &G){ int i,j,w,s1,s2;char a,b,temp;printf("输入顶点数和弧数:");scanf("%d%d",&G.vexnum,&G.arcnum);temp=getchar(); \/\/接收回车 G.vexs=(char *)malloc(G.vexnum*sizeof(char)); \/\/...

C语言简单编程题目两道,求高手做一下。高分!!!
int main(void){ int a[MAX], i = 0;srand(time(NULL)); \/\/ 时间种子, 保证真随机, 每次不会相同 while (i < MAX) { a[i] = rand() % 10000; \/\/ 随机获得10000以下数字, 0-9999 if (a[i] < 1000) { \/\/ 不是4位数 continue; \/\/ 重新随机 } i++;} FILE *fp...

相似回答
大家正在搜