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

1 篇文章 0 订阅
1 篇文章 0 订阅
//链表表示的 一元多项式,无参构造器,有参构造器,相加,遍历
#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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值