⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 untitled6.cpp

📁 一元稀疏多项式 的
💻 CPP
字号:
#include<stdio.h>
#include<malloc.h>


// 定义节点结构体
typedef struct node {
int xi;
int zhi;
struct node *next;
}Xnode,* Xpointer;

// 定义多项式链表结构体
typedef struct Polynomial {
int len;
Xpointer head;
Xpointer end;
}Poly;

// 对于链表的各种操作
// 初始化链表
int InitPoly(Poly *L) {
Xpointer n;
if(!(n=(Xpointer)malloc(sizeof(Xnode)))) return 0;
L->len = 0;
L->head = n;
L->end = n;
n->next = NULL;

return 1;
}

// 取得指定位置的节点
Xpointer GetNode(Poly *L,int pos) {
Xpointer n=L->head;
int i;
if(pos<1||pos>L->len) return 0;
for(i=0;i<pos;i++)
   n = n->next;
return n;
}

// 链表的排序,顺序为zhi的降序排列
void Sort(Poly *L) {
Xpointer n1,n2;
int i,j,temp;
for(i=1;i<L->len;i++) {
   n1=GetNode(L,i);
   for(j=i;j<=L->len;j++) {
    n2=GetNode(L,j);
    if(n1->zhi<n2->zhi) {
     temp=n1->zhi;
     n1->zhi=n2->zhi;
     n2->zhi=temp;
     temp=n1->xi;
     n1->xi=n2->xi;
     n2->xi=temp;
    }//if
   }//for
}//for
}//sort

// 链表的初次输入
int Input_Poly(Poly *L) {
Xpointer s;
int xi,zhi;
scanf("%d %d",&xi,&zhi);
while(xi!=0||zhi!=0) {
   if(!(s=(Xpointer)malloc(sizeof(Xnode)))) return 0;
   s->xi = xi;
   s->zhi = zhi;
   s->next = NULL;
   L->end->next = s;
   L->end = s;
   L->len++;
   scanf("%d %d",&xi,&zhi);
}
return 1;
}

// 链表元素的删除
int Del(Poly *L,int pos) {
Xpointer p,p1;
int len = L->len;
if(pos<1||pos>len) return 0;
p = GetNode(L,pos);
if(pos==1)
   p1 = L->head;
else
   p1 = GetNode(L,pos-1);
p1->next=p->next;
L->len--;
return 1;
}
// 链表元素的定位
int Locate(Poly *L,int zhi) {
Xpointer p = L->head;
int i;
for(i=1;i<=L->len;i++){
   p=p->next;
   if(p->zhi==zhi) break;
}
return i;
}
// 链表(多项式)的输出
void Output_Poly(Poly *L) {
Xpointer n = L->head;
int i;
if(L->len==0) printf("0\n");
else for(i=0;i<L->len;i++) {
   n=n->next;
   printf("%dx%d ",n->xi,n->zhi);
}
}

// 链表的合并
int join(Poly *L,Poly *L1,Poly *L2) {
Xpointer p=L->head,p1,p2,s;
int i;
for(i=1;i<=L1->len;i++) {
   if(!(s=(Xpointer)malloc(sizeof(Xnode)))) return 0;
   p1=GetNode(L1,i);
   s->xi=p1->xi;
   s->zhi=p1->zhi;
   s->next=NULL;
   L->end->next=s;
   L->end=s;
}
for(i=1;i<=L2->len;i++) {
   if(!(s=(Xpointer)malloc(sizeof(Xnode)))) return 0;
   p2=GetNode(L2,i);
   s->xi=p2->xi;
   s->zhi=p2->zhi;
   s->next=NULL;
   L->end->next=s;
   L->end=s;
}
L->len=L1->len+L2->len;
return 1;
}
// 以下是多项式之间的操作
// 多项式的加法
void Poly_add(Poly *L,Poly *L1,Poly *L2) {
Xpointer p;
int i,pos,len;
join(L,L1,L2);
Sort(L);
p=L->head->next;
len=L->len;
for(i=1;i<len;i++) {
   if(p->zhi==p->next->zhi) {
    pos=Locate(L,p->zhi);
    if(p->xi+p->next->xi==0) {
     Del(L,pos);
     Del(L,pos);
    }
    else {
     p->xi=p->xi+p->next->xi;
     Del(L,pos+1);
    }
   }
   else p=p->next;
}
}

// 多项式的减法
void Poly_sub(Poly *L,Poly *L1,Poly *L2) {
Xpointer p2=L2->head->next;
int i;
for(i=1;i<=L2->len;i++) {
   p2->xi = -p2->xi;
   p2=p2->next;
}
Poly_add(L,L1,L2);
}

 main()
{
Poly p1,p2,L,L2;
InitPoly(&p1);
InitPoly(&p2);
InitPoly(&L);
InitPoly(&L2);
printf("请输入多项式a:(系数 指数)\n");
Input_Poly(&p1);
printf("请输入多项式b:(系数 指数)\n");
Input_Poly(&p2);
Sort(&p1);
Sort(&p2);
printf("多项式a为:\n");
Output_Poly(&p1);
printf("\n多项式b为:\n");
Output_Poly(&p2);
printf("\na+b=\n");
Poly_add(&L,&p1,&p2);
Output_Poly(&L);
printf("\na-b=\n");
Poly_sub(&L2,&p1,&p2);
Output_Poly(&L2);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -