一元多项式计算——数据结构实习

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

typedef struct Lnode {
    int co;//系数
    int exp;//指数
    struct Lnode *next;
}Lnode;//结构体

Lnode Create() {//创建链表
    Lnode *head, *p;
	int c, e;
    head = (Lnode*)malloc(sizeof(Lnode));
    p = head;
    head->next = NULL;//创建空链表
	printf("请分别输入新的一项的系数和指数 (以系数0作为结束)\n");
    scanf("%d%d", &c, &e);//输入系数和指数
    //while((c!=-1) || (e!=-1)) {	//当指数不等于-1或系数不等于-1时进入循环尾插法建立链表
    while(c != 0 ) {
	    Lnode *s;
        s=(Lnode*)malloc(sizeof(Lnode));
        s->co=c;
        s->exp=e;
        scanf("%d%d", &c, &e);
        p->next=s;
        p=s;
    }
    p->next = NULL;
	return *head;
}

Lnode Add(Lnode *a, Lnode *b) {//多项式相加的函数
    Lnode *c;
    c = (Lnode*)malloc(sizeof(Lnode));
    c->next = NULL;//生成一个新的头结点
    Lnode *p1, *p2;
    p1 = a->next;//p1指向链表a的第一个节点
    p2 = b->next;//p2指向链表b的第一个节点
    Lnode *rear = c;
    
    while(p1 != NULL && p2 != NULL) {//当指针p1和p2都不为空时
        if(p1->exp > p2->exp) {//当链表a节点的指数数大于链表b节点的指数时 
            Lnode *p3;
            p3 = (Lnode*)malloc(sizeof(Lnode));//生成一个新节点p3;
            p3->co = p1->co;//把p1的系数赋值给p3的系数
            p3->exp = p1->exp;//把p1的指数赋值给p3的指数
            p3->next = NULL;//把p3的next赋值为空
            rear->next = p3;//把rear的next指向新节点p3
            rear = p3;//rear 指向p3
            p1 = p1->next;//p1移动到下一个指针位置
        }//总体实现的功能利用尾插法形成一个新的链表
        else if(p1->exp < p2->exp) {//当链表a节点的指数数小于链表b节点的指数时
            Lnode *p3;
            p3 = (Lnode*)malloc(sizeof(Lnode));
            p3->co = p2->co;//把p2的系数赋值给p3的系数
            p3->exp = p2->exp;//把p2的指数赋值给p3的指数
            p3->next = NULL;//p3 的next置为空 
            rear->next = p3;//把rear的next指向新节点p3
            rear = p3;//rear 指向p3
            p2 = p2->next;//p2移动到下一个指针位置
        }
       	else {//当p1->exp==p2->exp
        	if((p1->co != 0) && (p2->co != 0)) {//如果p1的系数和p2的系数不同时为0
            	Lnode *p3;
            	p3=(Lnode*)malloc(sizeof(Lnode));
            	p3->co = p1->co + p2->co;//把p1和p2系数的和赋值给p3的系数
            	p3->exp = p1->exp;//把p1的指数赋值给p3的指数
            	p3->next = NULL;
            	rear->next = p3;//把rear的next指向新节点p3
             	rear = p3;//rear 指向p3
           	}
            p2 = p2->next;//p2移动到下一个指针位置
            p1 = p1->next;//p1移动到下一个指针位置
       	}
    }
    if(p1==NULL) {
        while(p2 != NULL) {//当指针p1为空p2不为空时
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));//生成一个新节点
            p3->co = p2->co;
            p3->exp = p2->exp;
            p3->next = NULL;
            rear->next = p3;
            rear = p3;
            p2 = p2->next;
        }
    }
    else {
        while(p1 != NULL) {//当指针p1不为空p2为空时
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co = p1->co;
            p3->exp = p1->exp;
            p3->next = NULL;
            rear->next = p3;
            rear = p3;
            p1 = p1->next;
        }
    }
    return *c;//返回指针c
}

Lnode Del(Lnode *a,Lnode *b) {//多项式相减 
    Lnode *c;
    c=(Lnode*)malloc(sizeof(Lnode));
    c->next=NULL;
    Lnode *p1,*p2;
    p1=a->next;
    p2=b->next;
    Lnode *rear=c;
    while(p1!=NULL&&p2!=NULL) {//当p1不为空p2不为空时
        if(p1->exp>p2->exp) {//如果p1的指数小于p2的指数
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=p1->co;
            p3->exp=p1->exp;
            p3->next=NULL;
            rear->next=p3;
            rear=p3;
            p1=p1->next;
        }
        else if(p1->exp <p2->exp) {
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=-(p2->co);
            p3->exp=p2->exp;
            rear->next=p3;
            rear=p3;
            p2=p2->next;
        }
       	else {//p1->exp==p2->exp  p1的指数和p2的指数相等时
           if((p1->co!=0)&&(p2->co!=0)) {//p1的系数不等于p2的系数不等于0
            	Lnode *p3;
        		p3=(Lnode*)malloc(sizeof(Lnode));
            	p3->co=p1->co-p2->co;//把p1的系数减去p2的系数之差赋值给p3
            	p3->exp=p1->exp;//把p1的指数赋值给p3的指数
            	p3->next=NULL;
            	rear->next=p3;
             	rear=p3;
           	}
            p2=p2->next;
            p1=p1->next;
       }
    }
    if(p1==NULL) {
        while(p2!=NULL) {
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=-(p2->co);
            p3->exp=p2->exp;
            p3->next=NULL;
            rear->next=p3;
            rear=p3;
            p2=p2->next;
        }
    }
    else if(p2==NULL) {
        while(p1!=NULL) {
            Lnode *p3;
            p3=(Lnode*)malloc(sizeof(Lnode));
            p3->co=p1->co;
            p3->exp=p1->exp;
            p3->next=NULL;
            rear->next=p3;
             rear=p3;
              p1=p1->next;
        }
    }
    return *c;
}


void print(Lnode *head) {//打印节点的函数
    if(head==NULL) {//如果链表不存在
        printf("多项式不存在");
        return ;
    }
    Lnode *p;
    p = head->next;
    if(p != NULL && p->co!=0)//如果p指针不为空p的系数不为0
          printf("%d*x^%d",p->co,p->exp);
    p=p->next;
    while(p!=NULL) { 
        if(p->co > 0) {//当p的系数大于0时
            printf("+%d*x^%d",p->co,p->exp);//把连字符“+”打印出来
            p=p->next;
        }
        else if(p->co < 0) {//当p的系数小于0时
            	printf("%d*x^%d",p->co,p->exp);//此时不用打印"+"连字符
                p=p->next;
        }
    	else break;
    }
    printf("\n");
}



int main() {
    printf("请输入多项式A:");
    Lnode p;
    p=Create();//创建链表a
    printf("多项式A为:\n");
   	print(&p);
   	
    printf("请输入多项式B:\n");
    Lnode p1;
    p1=Create();//创建链表b
    printf("多项式B为:\n");
    print(&p1);
	
	Lnode p2, p3;
    p2 = Add(&p, &p1);//调用链表相加函数
    printf("多项式A加B后的结果为:");
    print(&p2);
    
    p3 = Del(&p, &p1);//调用链表相减函数
    printf("多项式A减B后的结果为:");
    print(&p3);
    
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40830622/article/details/80844795
今日推荐