数据结构——多项式相加

版权声明:一起学习一起进步,过程最美好,有问题欢迎一起讨论w https://blog.csdn.net/kanamisama0/article/details/52618023

该代码实现多项式的相加
主要函数:
1. 按照升序将结点插入链表
2. 输出链表
3. 两链表相加的过程

输入格式请看程序提示。

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#define FALSE 0
#define TRUE 1
typedef int DataType;

typedef struct tagNode
{
    float coef;
    int exp;
    struct tagNode *pNext;
};

typedef struct tagNode Node;
typedef struct tagNode *pNode;

// 将结点插入到链表的适当位置,这是一个指数升序排列的链表
void insertList(pNode head, pNode pnode) // 链表头结,待插入的结点
{
    pNode pPre = head;
    while(pPre->pNext != NULL)
    {
        if (pPre->pNext->exp > pnode->exp)
        {
            pnode->pNext = pPre->pNext;
            pPre->pNext = pnode;
            break;
        }
        else if(pPre->pNext->exp == pnode->exp)                 // 添加一个判断,判断新加入的结点和之前已加入结点是否有指数相同情况
        {                                                       // 即合并同类项
            pPre->pNext->coef = pPre->pNext->coef+pnode->coef;
            free(pnode);
            break;
        }
        pPre = pPre->pNext;
    }
    if (pPre->pNext == NULL) // 待插入的结点指数最大,直接插入到结点最后
    {
        pPre->pNext = pnode;
    }
}

// 输出链表
void printLinkedList(pNode head)
{
    pNode temp = head->pNext;
    while (temp != NULL)
    {
        printf(" %g", temp->coef);
        printf("x^%d +", temp->exp);
        temp = temp->pNext;
    }
    printf("\b \n");
}

// 两链表相加
void add_poly(Node *pa, Node *pb)
{
    Node *p = pa->pNext;   // 链表1,多项式结果放在链表1
    Node *q = pb->pNext;   // 链表2
    Node *pre = pa;
    Node *temp;            // 临时用
    float x;
    while(p != NULL && q != NULL)     // 当两个链表都不为空
    {
        if (p->exp < q->exp)          // 链表1的指数小于链表2的指数
        {
            pre = p;
            p = p->pNext;             // 链表1存放加和数据,不用操作。只需后移指针
        } 
        else if(p->exp == q->exp)     // 链表1指数和链表2指数相等
        {
            x = p->coef + q->coef;    // x存放系数和。判断x是否为0
            if (x != 0)               // x不为0则在链表1中更新加和的值
            {
                p->coef = x;
                pre = p;
            } 
            else                      // x为0则从链表1中移除该项
            {
                pre->pNext = p->pNext;
                free(p);
            }
            p = pre->pNext;           // p指向下一个判断的结点

            // 链表2结点的删除部分。
            temp = q;
            q = q->pNext;
            free(temp);
        }
        else                          // 如果链表1指数大于链表2指数,把当前结点插入链表1比较结点前
        {
            temp = q->pNext;
            q->pNext = p;
            pre->pNext = q;
            pre = q;
            q = temp;
        }
    }
    if (q)                           // 如果链表2比链表1长,则需要把2多余部分加到1后面。反之不用操作
    {
        pre->pNext = q;
    }
    free(pb);
}

int main()
{
    pNode head1 = (pNode)malloc(sizeof(struct tagNode));   // 给头指针分配空间
    pNode head2 = (pNode)malloc(sizeof(struct tagNode));
    int exp, temp1;                                               // 指数
    float coef, coef2;                                            // 系数
    pNode pTemp = NULL;
    head1->pNext = NULL;
    head2->pNext = NULL;

    // 读入多项式1
    printf("请输入要放入链表1中的数据,顺序为\'系数,指数\'。若多项式结束,则以0结尾。\n");
    // 读入数据,以0,0结尾,把数据插入链表中。
    scanf("%f,%d", &coef, &exp);
    while(coef != 0 || exp != 0)
    {
        pTemp = (pNode)malloc(sizeof(struct tagNode));
        pTemp->coef = coef;
        pTemp->exp = exp;
        pTemp->pNext = NULL;
        insertList(head1, pTemp);
        //temp1 = exp;
        //temp2 = coef;
        scanf("%f,%d", &coef, &exp);
    }
    printf("指数升序排列的多项式1为:\n");
    printLinkedList(head1);
    printf("\n");

    // 读入多项式2
    printf("请输入要放入链表2中的数据,顺序为\'系数,指数\'。若多项式结束,则以0结尾。\n");
    // 读入数据,以0,0结尾,把数据插入链表中。
    scanf("%f,%d", &coef, &exp);
    while(coef != 0 || exp != 0)
    {
        pTemp = (pNode)malloc(sizeof(struct tagNode));
        pTemp->coef = coef;
        pTemp->exp = exp;
        pTemp->pNext = NULL;
        insertList(head2, pTemp);
        scanf("%f,%d", &coef, &exp);
    }
    printf("指数升序排列的多项式2为:\n");
    printLinkedList(head2);
    printf("\n");

    // 多项式相加
    add_poly(head1, head2);
    printf("多项式相加的结果为:\n");
    printLinkedList(head1);
    printf("\n");

    system("pause");
    return 0;
}
展开阅读全文

没有更多推荐了,返回首页