|
#include <stdio.h>
#include <malloc.h>
#define ERROW 0
typedef struct Lnode {
float c;
int e;
struct Lnode* next;
}Lnode;
Lnode *Creat_list();
Lnode *addition(Lnode *head1, Lnode *head2);
Lnode *substraction(Lnode *head1, Lnode *head2);
Lnode *List_insert(Lnode *head,Lnode *p);
void List_Traverse(Lnode *head);
void List_sort();
int main() {
int judge;
Lnode *head1, *head2, *head3;
head1 = Creat_list();
head2 = Creat_list();
head3 = addition(head1, head2);
head4 = substraction(head1, head2);
head5 = Mult(head1,head2);
}
List_Traverse(head3);
List_Traverse(head4);
List_Traverse(head5);
}//main
Lnode *List_insert(Lnode *header, Lnode *p) {
Lnode *rear = NULL;
rear = header;
if (header == NULL) {
header = p;
p->next = NULL;
}//if
if(rear != NULL) {
while (1) {
if (rear->next == NULL) {
break;
}//if
rear = rear->next;
}//while
rear->next = p;
p->next = NULL;
}//if
return header;
}//List_insert
Lnode *Creat_list(){
Lnode *head = NULL;
Lnode *p = NULL, *q = NULL;
if (!(head = (Lnode *)malloc(sizeof(Lnode)))) {
return ERROW;
}
if (!(q = (Lnode *)malloc(sizeof(Lnode)))) {
return ERROW;
}
head->next = q;
p = q;
p->next = NULL;
while (1) {
scanf("%f%d", &q->c, &q->e);
if (getchar()!='\n') {
if (!(q = (Lnode *)malloc(sizeof(Lnode)))) {
return ERROW;
}
p->next = q;
p = q;
p->next = NULL;
}
else {
break;
}//else
}//while
return head;
}//Creat_list
Lnode *addition(Lnode *head1, Lnode *head2) {
float c;
Lnode *p1 = NULL, *p2 = NULL, *p = NULL, *q = NULL, *head = NULL, *header = NULL;
p1 = head1->next;
p2 = head2->next;
if (!(head = (Lnode *)malloc(sizeof(Lnode)))) {
return ERROW;
}
header = head->next;
header = NULL;
while (p1 != NULL&&p2 != NULL) {
if (p1->e > p2->e) {
if (!(p = (Lnode *)malloc(sizeof(Lnode)))) {
return ERROW;
}//if
p->c = p1->c;
p->e = p1->e;
p1 = p1->next;
header = List_insert(header, p);
}//if
else if(p1->e == p2->e){
if (!(p = (Lnode *)malloc(sizeof(Lnode)))) {
return ERROW;
}
p->c = p1->c + p2->c;
p->e = p1->e;
p1 = p1->next;
p2 = p2->next;
header = List_insert(header, p);
}//else if
else if (p1->e < p2->e) {
if (!(p = (Lnode *)malloc(sizeof(Lnode)))) {
return ERROW;
}//if
p->c = p2->c;
p->e = p2->e;
p2 = p2->next;
header = List_insert(header, p);
}//else if
}//while
while (p1 == NULL) {
if (p2 == NULL) {
break;
}//if
header = List_insert(header, p2);
p2 = p2->next;
}//while
while (p2 == NULL) {
if (p1 == NULL) {
break;
}//if
header = List_insert(header, p1);
p1 = p1->next;
}//while
return header;
}//addition
Lnode *substraction(Lnode *head1, Lnode *head2) {
Lnode *p = head2, *head = NULL;
while (p != NULL) {
p->c = -1 * p->c;
p = p->next;
}//while
head = addition(head1, head2);
return head;
}//substraction
Polynomial Mult(Polynomial P1,Polynomial P2)
{
Polynomial P,Rear,t1,t2,t;
int c,e;
if(!P1||!P2) return NULL;
t1=P1;
t2=P2;
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
Rear=P;
while(t2){
Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
t2=t2->link;
}
t1=t1->link;
while(t1){
t2=P2;
Rear=P;
while(t2){
e=t1->expon+t2->expon;
c=t1->coef*t2->coef;
while(Rear->link&&Rear->link->expon>e)
Rear=Rear->link;
if(Rear->link&&Rear->link->expon==e){
if(Rear->link->coef+c)
Rear->link->coef+=c;
else{
t=Rear->link;
Rear->link=t->link;
free(t);
}
}else{
t=(Polynomial)malloc(sizeof(struct PolyNode));
t->coef=c;t->expon=e;
t->link=Rear->link;
Rear->link=t;Rear=Rear->link;
}
t2=t2->link;
}
t1=t1->link;
}
t2=P;
P=P->link;
free(t2);
return P;
}
void List_Traverse(Lnode *head) {
Lnode *p = head;
if (p == NULL) {
printf("zero");
}
while (p != NULL) {
printf("%f %d ", p->c, p->e);
p = p->next;
}//while
}//List_Traverse
实现乘法
#include <stdio.h>
#include <malloc.h>
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
};
void Attach(int c,int e,Polynomial *pRear) //pRear是指针的指针
{
Polynomial P;
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->coef=c; //对新结点赋值
P->expon=e;
P->link=NULL;
(*pRear)->link=P; //修改pRear的值
*pRear=P;
}
Polynomial ReadPoly()
{
Polynomial P,Rear,t;
int c,e,N;
scanf("%d",&N);
P=(Polynomial)malloc(sizeof(struct PolyNode)); //链表头空结点
P->link=NULL;
Rear=P;
while(N--){
scanf("%d%d",&c,&e);
Attach(c,e,&Rear); //将当前项插入多项式尾部
}
t=P;P=P->link;free(t); //删除临时生成的头结点
return P;
}
Polynomial Add(Polynomial P1,Polynomial P2)
{
Polynomial front,rear,temp;
int sum;
rear=(Polynomial)malloc(sizeof(struct PolyNode));
front=rear; /*由front记录结果多项式链表头结点*/
while(P1&&P2){ /*当两个多项式都有非零项待处理时*/
if(P1->expon==P2->expon){
sum=P1->coef+P2->coef;
if(sum){
Attach(sum,P1->expon,&rear);
P1=P1->link;
P2=P2->link;
}else{
P1=P1->link;
P2=P2->link;
}
}else if(P1->expon>P2->expon){
Attach(P1->coef,P1->expon,&rear);
P1=P1->link;
}else{
Attach(P2->coef,P2->expon,&rear);
P2=P2->link;
}
}
/*将未处理完的另一个多项式的所有节点依次复制到结果多项式中去*/
while(P1){
Attach(P1->coef,P1->expon,&rear);
P1=P1->link;
}
while(P2){
Attach(P2->coef,P2->expon,&rear);
P2=P2->link;
}
rear->link=NULL;
temp=front;
front=front->link; /*令front指向结果多项式第一个非零项*/
free(temp); /*释放临时空表头结点*/
return front;
}
/*采用逐项插入的方法,将P1当前项乘以P2的当前项,并插入到结果多项式中,关键是要找到插入的位置*/
/*初始结果多项式由P1第一项乘以P2各项获得*/
Polynomial Mult(Polynomial P1,Polynomial P2)
{
Polynomial P,Rear,t1,t2,t;
int c,e;
if(!P1||!P2){
return NULL;
}
t1=P1;t2=P2;
P=(Polynomial)malloc(sizeof(struct PolyNode));P->link=NULL;
Rear=P;
while(t2){ //P1第一项乘以P2各项得到初始结果多项式
Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
t2=t2->link;
}
t1=t1->link;
while(t1){
t2=P2;Rear=P;
while(t2){
e=t1->expon+t2->expon;
c=t1->coef*t2->coef;
while(Rear->link&&Rear->link->expon>e)
Rear=Rear->link;
if(Rear->link&&Rear->link->expon==e){
if(Rear->link->coef+c)
Rear->link->coef+=c;
else{
t=Rear->link;
Rear->link=t->link;
free(t);
}
}
else{
t=(Polynomial)malloc(sizeof(struct PolyNode));
t->coef=c;
t->expon=e;
t->link=Rear->link;
Rear->link=t;
Rear=Rear->link;
}
t2=t2->link;
//printf("%d,%d\n",Rear->coef,Rear->expon);
}
t1=t1->link;
}
t2=P;P=P->link;free(t2);
return P;
}
void PrintPoly(Polynomial P)
{
int flag=0; //辅助调整输出格式用
if(!P){
printf("0 0\n");
return;
}
while(P){
if(!flag)
flag=1;
else
printf(" ");
printf("%d %d",P->coef,P->expon);
P=P->link;
}
}
int main()
{
Polynomial P1,P2,PS,PP;
P1=ReadPoly();
P2=ReadPoly();
PP=Mult(P1,P2);
PrintPoly(PP);
printf("\n");
PS=Add(P1,P2);
PrintPoly(PS);
return 0;
}
|