一元多项式的表示及相加 【链表的应用】

#include <iostream>
#include <cstdio>
#include <stdlib.h>
using namespace std;

struct Node {
	double coef;
	int expn;
	Node *next;
};

void CreatPolynomial(Node *&head, int n)        //生成带表头结点的单链表,除头结点外另生成n个结点  
{
	head = (Node *)malloc(sizeof(Node));
	head->coef = 0;
	head->expn = 0;
	head->next = NULL;                           //初始化头结点  
	cout << "请输入各项系数及指数:"<< endl;
	Node *p = head;
	for(int i = 0; i < n; i++) {
		p->next = (Node *)malloc(sizeof(Node));  //生成新结点,尾插入生成链表  
		p = p->next;
		cin >> p->coef >> p->expn;
		p->next = NULL;
	}
}

void PrintPolynomial(Node *&head)
{
	if(head->next == NULL)                            //结果是0时直接输出0  
		putchar('0');
    else {
		for(Node *p = head->next; p != NULL; p = p->next){  
			if(p != head->next && p->coef >0)        //当p非首项且指向的系数为正时才输出'+'  
				putchar('+');                        //之前只判定了p->coef >0  
                
			if(p->coef == 1){                       //系数为1或-1时特殊处理  
				if(p->expn == 0)
					putchar('1');                   //判断条件不能写在一起:  
			}                                      //if(p->coef == 1 && p->expn == 0) putchar('1');  
			else if(p->coef == -1)
				putchar('-');
			else
				cout << p->coef;
              
			switch(p->expn){                        //指数为0或1时特殊处理  
            
			case 0:
				break;
                
			case 1:
				putchar('x');
				break;
                
			default:
				p->expn < 0 ? printf("x^(%d)", p->expn) : printf("x^%d", p->expn);  //  指数小于0时打括号  
				break;
			}
		}
	}
	cout << endl;
}
  
void Free(Node *&head)
{
	Node *q = NULL;
	for(Node *p = head; p != NULL; p = q){
		q = p->next;
		free(p);
	}
}

char cmp(int a, int b)
{
	if(a > b)
		return '>';
	if(a < b)
		return '<';
	return '=';
}

void AddPolynomial(Node *&pA, Node *&pB)        //传进两个链表的头指针  
{
	Node *ha = pA;
	Node *hb = pB;
	Node *qa = ha->next;                     //ha, hb分别跟在qa, qb的后一位置  
	Node *qb = hb->next;                     //qa, qb分别指向Pa, Pb中当前比较元素  
	while(qa && qb)
	{
		double sum = 0;
		int a = qa->expn;
		int b = qb->expn;
		switch( cmp(a, b) ){
              
		case '<':
			ha = qa;
			qa = qa->next;                       //非ha = ha->next;  
			break;
              
		case '=':
			sum = qa->coef + qb->coef;
			if(sum != 0.0) {
				qa->coef = sum;
				ha = qa;       
			}
			else {
				if(ha->next != qa)
					cout << "Error: ha->next != qa" << endl;
				ha->next = ha->next->next;     //删除和为0的结点,ha不变,还在qa后一位置  
				free(qa);
			}
			if(hb->next != qb)
				cout << "Error: hb->next != qb" << endl;
			hb->next = hb->next->next;
			free(qb);
			qb = hb->next;
			qa = ha->next;
			break;
              
		case '>':
			hb->next = hb->next->next;         //删除qb指向的结点  
			qb->next = ha->next;              //将qb插入ha后qa前  
			ha->next = qb;
              
			qb = hb->next;                       //not qb = ha->next  
			ha = ha->next;
			break;
              
		default:
			cout << "Error!" << endl;
			break;
		}
	}
	if(qb)
		ha->next = qb;
	free(hb);
}
  
int main()
{                                             //freopen("cin.txt", "r", stdin);  
	Node *A = NULL;
	Node *B = NULL;
	int lenA;
	int lenB;
	while(cout << "请输入A的项数:" << endl, cin >> lenA) {
		CreatPolynomial(A, lenA);                   //生成A链表         
		cout << "请输入B的项数:" << endl;         //生成B链表  
		cin >> lenB;
		CreatPolynomial(B, lenB);
          
		cout << " A = ";                          //输出A链表  
		PrintPolynomial(A);
		cout << " B = ";                          //输出B链表  
		PrintPolynomial(B);
          
		AddPolynomial(A, B);                        //A = A + B  
		cout << "A+B= ";
		PrintPolynomial(A);                         //输出和  
		cout << endl;
          
		Free(A);                                    //务必释放结点  
	}
	return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一元多项式可以使用结构体来表示,其中结构体包括两个成员变量,一个是系数,另一个是指数。下面是一元多项式的结构体定义: ```c typedef struct node { float coef; // 系数 int expn; // 指数 struct node *next; } Polynomial; ``` 其中,`next` 是指向下一个结点的指针,可以用来构造链表。 下面是一元多项式相加的具体代码实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct node { float coef; // 系数 int expn; // 指数 struct node *next; } Polynomial; // 生成多项式 Polynomial *create() { Polynomial *p, *r, *head; head = (Polynomial*)malloc(sizeof(Polynomial)); head->next = NULL; r = head; int n, i; float c; printf("请输入多项式的项数:"); scanf("%d", &n); for (i = 1; i <= n; i++) { printf("请输入第%d项的系数和指数:", i); scanf("%f %d", &c, &e); p = (Polynomial*)malloc(sizeof(Polynomial)); p->coef = c; p->expn = e; p->next = NULL; r->next = p; r = p; } return head; } // 多项式相加 Polynomial *add(Polynomial *pa, Polynomial *pb) { Polynomial *pc, *qa, *qb, *p, *q, *t; pc = (Polynomial*)malloc(sizeof(Polynomial)); pc->next = NULL; qa = pa->next; qb = pb->next; p = pc; while (qa && qb) { if (qa->expn < qb->expn) { t = (Polynomial*)malloc(sizeof(Polynomial)); t->coef = qa->coef; t->expn = qa->expn; t->next = NULL; p->next = t; p = t; qa = qa->next; } else if (qa->expn > qb->expn) { t = (Polynomial*)malloc(sizeof(Polynomial)); t->coef = qb->coef; t->expn = qb->expn; t->next = NULL; p->next = t; p = t; qb = qb->next; } else { t = (Polynomial*)malloc(sizeof(Polynomial)); t->coef = qa->coef + qb->coef; t->expn = qa->expn; t->next = NULL; p->next = t; p = t; qa = qa->next; qb = qb->next; } } while (qa) { t = (Polynomial*)malloc(sizeof(Polynomial)); t->coef = qa->coef; t->expn = qa->expn; t->next = NULL; p->next = t; p = t; qa = qa->next; } while (qb) { t = (Polynomial*)malloc(sizeof(Polynomial)); t->coef = qb->coef; t->expn = qb->expn; t->next = NULL; p->next = t; p = t; qb = qb->next; } return pc; } // 输出多项式 void print(Polynomial *p) { Polynomial *q = p; while (q->next) { q = q->next; printf("%.2fx^%d", q->coef, q->expn); if (q->next) { printf(" + "); } } printf("\n"); } int main() { Polynomial *pa, *pb, *pc; printf("请输入第一个多项式:\n"); pa = create(); printf("请输入第二个多项式:\n"); pb = create(); pc = add(pa, pb); printf("相加后的多项式为:\n"); print(pc); return 0; } ``` 此代码中使用了单链表来存储多项式,`create` 函数用来生成多项式,`add` 函数用来实现多项式相加,`print` 函数用来输出多项式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值