链表表示的 一元多项式,无参构造器,有参构造器,相加,遍历

本文介绍了一元多项式的链表表示方法,并实现了多项式的创建、加法运算及遍历输出等功能。通过C语言具体实现,包括无参构造器初始化多项式链表、有参构造器创建指定多项式、多项式节点的加法运算等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//链表表示的 一元多项式,无参构造器,有参构造器,相加,遍历
#include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 typedef int Status; #define LEN sizeof(Node) #define MLC (Node*)malloc(sizeof(Node)) //-------链表表示的 一元多项式 -------------- typedef struct PNode { float coef; //系数 data域 int expn; //指数 data域 PNode* next; //引用 ptr域 int(*Length)(PList L); //长度 PNode*(*MakeNode)(PNode* polyElem); //无参构造器, 用函数指针实现 成员函数 PNode*(*SetCurItemValue)(); //有参构造器,设置工作节点data value void(*CreatePloyn)(PList L, int length); //建立链表 }PNode, *PList; //无参构造器,在c语言里面实现构造器,赋值语句, PNode* MakeNode() { PNode* head = (PNode*)malloc(sizeof(PNode)); if (!head) /* 存储分配失败 */ exit(OVERFLOW); coef = 0.0;//赋值语句 默认值 expn = 0; next = NULL; return head; } //有参构造器,建立有值的多项式链表 void CreateValuePloyn(PList p, int length) { PList e = PList.MakeNode();//无参构造器 for (int i = 0; i < length; i++) { scanf("%i,%i", &e->coef, &e->expn); //赋值,系数,指数 //输入各项的系数和指数,建立一元多项式的有序链表p } } /* 将值为data的结点插入到head链表的最后 */ // AppendByInstanseNode void AppendNode(PNode *head, double coef, int exp) { PNode* pre = head->next; PNode* temp; //tempNode* temp = (PNode*)malloc(sizeof(PNode)); temp->coef = coef; temp->exp = exp; temp->next = NULL; if (pre == NULL) { head->next = temp; return; } for (; pre->next != NULL; pre = pre->next); pre->next = temp; } //多项式节点的加法 PNode* Add(PNode *headA, PNode *headB) { PNode *currA, *currB, *headC; double sum; currA = headA->next; currB = headB->next; headC = Init(); while (currA != NULL && currB != NULL) { if (currA->exp > currB->exp) { AppendNode(headC, currA->coef, currA->exp); currA = currA->next; } else if (currA->exp < currB->exp) { AppendNode(headC, currB->coef, currB->exp); currB = currB->next; } else { sum = currA->coef + currB->coef; if (sum != 0) { AppendNode(headC, sum, currA->exp); } currA = currA->next; currB = currB->next; } } while (currA != NULL) { AppendNode(headC, currA->coef, currA->exp); currA = currA->next; } while (currB != NULL) { AppendNode(headC, currB->coef, currB->exp); currB = currB->next; } return headC; } /* 返回head链表的所有结点的数量 */ int Size(PNode *head) { int len = 0; PNode *curr; for (curr = head->next; curr != NULL; curr = curr->next, len++); return len; } //访问结点输出 Status visit(PList p) { printf("(%lf, %d)\t", p->coef, p->expn); return TRUE; } //遍历链表输出 :依次对L的每个元素调用visit() void ListTraverse(PList L, void(*visit)(PNode)) { /* 依次对L的每个元素调用vi(),打印输出语句*/ PList p; //temp ptr p = L->next; //pass the head node printf("All nodes's values are : "); while (p != NULL) { visit(p); //visit and print p = p->next; } printf("\n"); } //主函数 void main() { PNode *headA, *headB, *headC; headA = Init(); headB = Init(); AppendNode(headA, 1.0, 5); AppendNode(headA, -1.0, 3); AppendNode(headA, 1, 0); AppendNode(headB, 0.5, 5); AppendNode(headB, 1.0, 4); AppendNode(headB, 1.0, 3); ListTraverse(headA); ListTraverse(headB); headC = Add(headA, headB); ListTraverse(headC); }

 

转载于:https://www.cnblogs.com/blacop/p/6611821.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值