【数据结构】ZJNU1001 实验一 链表及其多项式相加

195 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Description

通过有序对输入多项式的各个项,利用单链表存储该一元多项式,并建立的2个存储一元多项式的单链表,然后完成2个一元多项式的相加,并输出相加后的多项式。

要求: 一个主函数和三个子函数,包括:

(1) 多项式输入函数——链表建立函数

(2) 多项式相加函数——链表的合并

(3) 多项式输出函数——链表的输出

Input

输入数据有多组,对于每组测试数据,第一行一个整数n,表示第一个多项式La的项数;接下来n行,每行表示多项式的一项,包含两个元素,表示系数和指数;接下来一个整数m,表示第二个多项式Lb的项数;接下来m行,每行表示多项式的一项,包含两个元素,表示系数和指数;两个多项式的输入都是按指数从小到大。(n,m<=1000)

Output

La与Lb相加之后的多项式。 按指数从小到大输出,每行一项,用空格把系数和指数分开。

Sample Input

3

1 2

2 3

3 4

3

4 3

2 5

4 6

Sample Output

1 2

6 3

3 4

2 5

4 6

代码区:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstdlib>//malloc函数需要这个头文件

using namespace std;

typedef struct LinkList//重命名结构体(方便一点)
{
    int xi;//系数
    int zhi;//指数
    LinkList * next;//指向下一个结点
}LinkList;

LinkList* InitList()//创建链表  返回值为结构体指针
{
    LinkList *q=(LinkList *)malloc(sizeof(LinkList));//创建头结点
    q->next=NULL;//初始化头结点,将其next指向NULL
    return q;//返回已创建的头结点
}
void InsertList(LinkList *L,int x,int y)//插入函数
{
    LinkList *p=L; //将P等于L,以免以下操作将头结点改变
    while(p->next)
        p=p->next; //将链表一直推到最后一个结点
    LinkList *q=(LinkList *)malloc(sizeof(LinkList)); //创建一个新结点
    q->next=NULL;//惯例嘻嘻,将next指针设定为NULL
    q->xi=x;//将系数存入结点
    q->zhi=y;//将指数存入结点
    p->next=q;//使p(也就是链表的最后一个结点)指向新创建的结点,实现插入新结点
}
LinkList* UnionList(LinkList *A,LinkList *B)
//实现函数将两个链表按指数从小到大合并起来(传入值为两个链表的头结点)
{
    LinkList *p1=A->next;//定义一个p1等于A链表的第一个结点
    LinkList *p2=B->next;//定义一个p2等于B链表的第一个结点
    LinkList *head=InitList();//创建一个头结点为head
    LinkList *p3=head;//p3等于新链表的头结点
    while(p1&&p2)//当两个链表的值都还有时(都不为空)
    {
        if(p1->zhi<p2->zhi)//当p1指数小于p2时,需要排在前面
        {
            p3->next=p1;//即将p3的下一个指向p1
            p3=p3->next;//p3指向下一个结点
            p1=p1->next;//p1的值已经存入p3,所以将p1等于p1的下一个结点
        }
        else if(p1->zhi>p2->zhi) //当p2的指数小于p1的时,p2排在前面
        {
            p3->next=p2;//同上
            p3=p3->next;
            p2=p2->next;
        }
        else//当指数相等时
        {
            if(p1->xi+p2->xi==0)//如果两个系数相加为零,则该结点不进去p3链表
            {
                p1=p1->next;
                p2=p2->next;
                //两个结点各自向后一个结点
            }
            else//当系数不相等时
            {
                p1->xi+=p2->xi;//将p1和p2的系数相加存放至p1结点中
                p3->next=p1;//将相加后的p1结点链至p3链表之后
                p3=p3->next;//现有结点已经装了所以将p3向后一个结点
                p1=p1->next;
                p2=p2->next;
                //p1,p2两个结点各自向后一个结点
            }
        }
    }
    if(p1) p3->next=p1;//如果p1,p2其中一个为空时,找出不为空的那个链表链入p3链表中
    else p3->next=p2;
    return head;//返回p3的头结点
}
void ListPrint(LinkList *L)//打印输出结点信息
{
    LinkList *p=L->next;//p为头结点L的下一个结点
    while(p)//当p链表不为空时,输出
    {
        cout << p->xi << ' ' << p->zhi << endl;
        p=p->next;//指向下一个结点
    }
}
int main()
{
    int n,x,y;
    while(cin >> n)//输入第一多项式项数
    {
            LinkList *A=InitList();//创建A链表头结点
            while(n--)
            {
                cin >> x >> y;//输入系数和指数
                InsertList(A,x,y);//调用插入函数
            }
        cin >> n;//输入第二多项式项数
        LinkList *B=InitList();//创建B链表头结点
        while(n--)
        {
            cin >> x >> y;
            InsertList(B,x,y);
        }
        LinkList *C=UnionList(A,B);//将AB两个链表合并成,链表C
        ListPrint(C);//输出相加后的系数和项数
    }
    return 0;
}

新手上路,有错请指正