| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 602 人关注过本帖
标题:利用带头结点的有序单链表(按指数有序)实现一元稀疏多项式的减法运算
只看楼主 加入收藏
静水gzc
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-7
结帖率:0
收藏
 问题点数:0 回复次数:0 
利用带头结点的有序单链表(按指数有序)实现一元稀疏多项式的减法运算
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>

#define MAX 10 //头指针数组的大小 //多项式的数据类型定义

typedef struct Polynomial {
    float coef; //系数

int expn;  //指数

struct Polynomial*next; }*Polyn,Polynomial; Polyn head[MAX+1]; //头指针数组,用来标记多项式

//创建多项式



void OrderInsert(Polyn p,Polyn h) //头结点是h,新结点p
{ //顺序插入结点

 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;}}}
void CreatePolyn(Polyn p){//建立一个头指针为head[i]一元多项式
Polyn q;
q=(Polyn)malloc(sizeof(struct Polynomial));
 
printf(" 请输入某项的系数与指数:");
scanf("%f %d",&q->coef,&q->expn);
 while(q->coef!=0)
{
   OrderInsert(q,p); //调用OrderInsert函数插入结点
 q=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
 
printf(" 请输入某项的系数与指数:");
scanf("%f %d",&q->coef,&q->expn); }
}
 
void Create() { //创建函数

 
int i=0,n=0;
 printf(" 请输入你想创建的多项式序号(1-%d):",MAX);
 scanf("%d",&i); CreatePolyn(head[i]);
}
//显示多项式
 
void PrintPolyn(Polyn p) { //打印多项式
 
  Polyn L; L=p; printf(" ");
if(L==NULL) { printf("NULL\n");
return; }
if(L->next==NULL) {
printf("0\n");
  return;
}
 while(L->next!=NULL)
{
L=L->next;
  
if(L->expn!=0)
    printf("%fX^%d",L->coef,L->expn);
 
else printf("%f",L->coef);
 if(L->next!=NULL&&L->next->coef>0)
 printf("+");
 if(L->next==NULL)
   printf("\n");  }
}
 
void Print() { //打印函数

 int i=0;
 printf(" 请输入你想显示的多项式序号(1-%d):",MAX);
  scanf("%d",&i);
 printf(" 此多项式为:");
  PrintPolyn(head[i]);
} //复制多项式
 void CopyPolyn(Polyn p1,Polyn p2) {   //复制多项式p1到p2
 
 Polyn L1,L2,L;
 L1=p1;
 L2=p2;
   while(L1->next!=NULL)
{
 L1=L1->next;
 L=(Polyn)malloc(sizeof(struct Polynomial));
 L->coef=L1->coef;
 L->expn=L1->expn;
 
L->next=NULL;
 L2->next=L;
  L2=L; }
}


 
void Copy() { //复制函数

 
int i=0;
 
int j=0;
 printf(" 请输入被复制的多项式序号和复制到的位置序如'5,3':");
 scanf("%d,%d",&i,&j);
  while(head[i]->next==NULL)
{
 printf(" 被复制的多项式还未被创建,请重新输入:\n");
 scanf("%d",&i);
}
  printf(" 被复制的多项式为:\n");
 PrintPolyn(head[i]);
 while(head[j]->next!=NULL)
{
printf(" 复制到的位置已存在其他多项式,请重新输入:\n");
scanf("%d",&j);
}
CopyPolyn(head[i],head[j]);
printf(" 复制后的多项式:\n");
PrintPolyn(head[j]); }//多项式求差

 void SubtractPolyn(Polyn p,Polyn p1,Polyn p2) { //多项式p1减多项式p2结果存在p中
 
Polyn L,L1,L2,q;
L=p;
L1=p1->next;
 L2=p2->next;
 while(L1!=NULL||L2!=NULL) {
 if(L1!=NULL&&L2!=NULL) { //按指数增长排列

 
q=(Polyn)malloc(sizeof(struct Polynomial));  
q->next=NULL;
 if(L1->expn<L2->expn)
{
 q->coef=L1->coef;
  q->expn=L1->expn;
 L->next=q;

L=q;
 L1=L1->next;
}
  else if(L1->expn>L2->expn)
{
 q->coef=-L2->coef;
 q->expn=L2->expn;
L->next=q;

L=q;
 L2=L2->next;
}
else if(L1->expn==L2->expn) { //指数相等需要判断系数差是否为零


 if((L1->coef-L2->coef)!=0) {
 q->coef=L1->coef-L2->coef;
 q->expn=L1->expn;
 L->next=q;
 L=q;
}
 L1=L1->next;
L2=L2->next;
} }
 else
if(L1==NULL&&L2!=NULL) //若p1遍历完,直接讲另一个多项式的剩余项系数取负移至p
 while(L2!=NULL)
{
q=(Polyn)malloc(sizeof(struct Polynomial));
q->next=NULL;
q->coef=-L2->coef;
 q->expn=L2->expn;
L->next=q;
 L=q;
 L2=L2->next;
}
 else
while(L1!=NULL) //若p2遍历完,直接讲另一个多项式的剩余项移至p
{
q=(Polyn)malloc(sizeof(struct Polynomial));
q->next=NULL;
 q->coef=L1->coef;
q->expn=L1->expn;
 L->next=q;
 L=q;
L1=L1->next;}}
PrintPolyn(p);
}

 
void Subtract() { //求差函数

 int i=0,m=0,n=0;
 printf(" 请输入多项式求差后的存放位置:");
 scanf("%d",&i);
while(head[i]->next!=NULL)
{
 printf(" 此位置已存在另一多项式,请重新输入:");
scanf("%d",&i);
}
 
printf(" 请输入需要求差的两个多项式的序号(1-%d)如'4,8'(前减后):",MAX);
scanf("%d,%d",&m,&n);
 SubtractPolyn(head[i],head[m],head[n]); }
void main() {
 int n=1, i=0;
 for(i=1;i<=MAX;i++) {
  head[i]=(Polyn)malloc(sizeof(Polynomial));
 head[i]->next=NULL; }
 while (n!=0) {
 printf("多项式求差;\n");
scanf("%d", &n);
switch(n){
case 1:
    Subtract();break;}

}}
为什么写出来有些数据结果不对,求哪位大神帮忙注释一下要点,谢谢啊
搜索更多相关主题的帖子: include 多项式 
2013-11-07 20:22
快速回复:利用带头结点的有序单链表(按指数有序)实现一元稀疏多项式的减法运算 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027751 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved