多项式链表相加

该程序通过链表形式表示多项式,并实现了两个有序多项式链表的相加。每个节点表示多项式中的一项,包括系数和指数。

代码

#include <stdio.h>
#include <stdlib.h>
//#include <stdbool.h>

/* 节点结构体,表示多项式的一项 */
struct Node{
    int val;           // 系数
    int exp;           // 指数
    struct Node* next; // 指向下一项
};

/*
 * 函数名:creatlist
 * 功能:创建一个按指数升序排列的多项式链表
 * 参数:
 *     head - 链表头指针(初始为 NULL)
 *     n    - 需要输入的项数
 * 返回值:
 *     创建好的链表头指针
 */
struct Node* creatlist(Node* head, int n){
    for(int i = 1; i <= n; i++){
    	// 分配新节点
        struct Node* tmp = (struct Node*)malloc(sizeof(struct Node)); 
        tmp->next = NULL;
        printf("请输入第%d项的系数和指数: ",i);
        scanf("%d %d", &tmp->val, &tmp->exp);
        
        if(head == NULL){
            // 第一个节点直接作为头节点
            head = tmp;
        } else {
            struct Node* cur = head;
            struct Node* pre = head;
            bool find = false; // 用于标记是否插入完成
            // 找到插入位置,保持指数升序
            while(cur){
                if(cur->exp > tmp->exp){
                    if(cur == head){
                        // 插到头部
                        head = tmp;
                        tmp->next = cur;
                    } else {
                        // 插到中间
                        pre->next = tmp;
                        tmp->next = cur;
                    }
                    find = true;
                    break;
                }
                pre = cur;
                cur = cur->next;
            }
            if(!find){
                // 没有找到比它大的指数,插到末尾
                pre->next = tmp;
            }
        }
    }
    return head;
}

/*
 * 函数名:addtwolist
 * 功能:将两个有序多项式链表相加,生成一个新的有序多项式链表
 * 参数:
 *     head1 - 第一个多项式链表头
 *     head2 - 第二个多项式链表头
 * 返回值:
 *     结果多项式链表头指针
 */
struct Node* addtwolist(Node* head1, Node* head2){
    struct Node* h3 = NULL;  // 结果链表头
    struct Node* cur = h3;   // 指向结果链表末尾
    
    while(head1 && head2){
        struct Node * tmp = (struct Node*)malloc(sizeof(struct Node)); // 分配新节点
        tmp->next = NULL;
        
        if(head1->exp == head2->exp){
            // 指数相同,系数相加
            tmp->val = head1->val + head2->val;
            tmp->exp = head1->exp;
            
            if(h3 == NULL){
                h3 = tmp;
                cur = tmp;
            } else {
                cur->next = tmp;
                cur = cur->next;
            }
            
            head1 = head1->next;
            head2 = head2->next; 
        } 
        else if(head1->exp < head2->exp){
            // head1 指数小,直接拷贝
            tmp->val = head1->val;
            tmp->exp = head1->exp;
            
            if(h3 == NULL){
                h3 = tmp;
                cur = tmp;
            } else {
                cur->next = tmp;
                cur = cur->next;
            }
            
            head1 = head1->next;
        } 
        else {
            // head2 指数小,直接拷贝
            tmp->val = head2->val;
            tmp->exp = head2->exp;
            
            if(h3 == NULL){
                h3 = tmp;
                cur = tmp;
            } else {
                cur->next = tmp;
                cur = cur->next;
            }
            
            head2 = head2->next;
        }
    }
    if(cur == NULL){
        return NULL; // 两个链表都为空
    }
    // 拼接剩余节点
    if(head1) {
        cur->next = head1;
    }
    if(head2){
        cur->next = head2;
    }
    return h3;
}

/*
 * 函数名:printlist
 * 功能:输出多项式链表
 * 参数:
 *     head - 链表头
 * 返回值:无
 */
void printlist(struct Node* head){
    while(head){
        if(head->next == NULL){
            printf("%dx^%d\n", head->val, head->exp);
            break;
        }
        printf("%dx^%d+", head->val, head->exp);
        head = head->next;
    }
}

int main()
{
    int n1 = 0, n2 = 0;
    printf("请输入第一个多项式的项数:\n"); 
    scanf("%d", &n1);
    struct Node* h1 = NULL;
    h1 = creatlist(h1, n1);
    printf("请输入第二个多项式的项数:\n"); 
    scanf("%d", &n2);
    struct Node* h2 = NULL;
    h2 = creatlist(h2, n2);
    struct Node* h3 = NULL;
    h3 = addtwolist(h1, h2);
    printlist(h3);
    return 0;
}

/*
测试数据:
3
2 1
5 3
2 4
2
2 5
3 4
*/

输出结果

Image