西电数据结构oj 单链表 多项式加减法

发布时间 2024-01-05 11:37:34作者: printf("赖狒狒");

试题名称    多项式加减法

时间限制:   1 秒

内存限制:   10000KB

 

问题描述

给定两个多项式,求解其和与差。多项式的项数为M,而最高幂次为N。(1<=M<=10,1<=N<=1000000)

 

输入说明

输入包含了两个多项式,分为两行给出(同行数据间以空格隔开):

 

每一行为两组数据:第一组为一个值,表示多项式的非零项数M;第二组为2*M个值,每相邻两个值表达一个多项式的非零系数项,分别为系数值、幂次值(其中各项按照幂次的降序排列)。但如果多项式没有非零系数项,则仅用0(M的值)表示,后面没有系数和幂次值出现。例如,第一行的数据为:4 1 10 2 5 3 4 4 0,那么表示多项式有4项,对应的多项式为:x^10+2x^5+3x^4+4. 又例如,第二行的数据为:4 1 8 -2 5 3 3 4 1,表示多项式有4项,对应的多项式为:x^8-2x^5+3x^3+4x。那么上述两个多项式相加的输出结果应为:6 1 10 1 8 3 4 3 3 4 1 4 0,对应的多项式为:x^10+x^8+3x^4+3x^3+4x+4.第一个多项式减去第二个多项式的输出结果为:7 1 10 -1 8 4 5 3 4 -3 3 -4 1 4 0,对应多项式:x^10-x^8+4x^5+3x^4-3x^3-4x+4.

 

输出说明

输出包含了两个多项式,分为两行给出(同行数据间以空格隔开):

 

第一行是多项式相加的结果,第二行是多项式相减的结果。每一行为两组数据:第一组为一个值,表示多项式的非零项数M;第二组为2*M个值,每相邻两个值表达一个多项式的非零系数项,分别为系数值、幂次值(其中各项按照幂次的降序排列)。但如果多项式没有非零系数项,则仅用0(M的值)表示,后面没有系数和幂次值出现。

 

输入样例

例1:

4 1 10 2 5 3 4 4 0

4 1 8 -2 5 3 3 4 1

 

输出样例

例1:

6 1 10 1 8 3 4 3 3 4 1 4 0

7 1 10 -1 8 4 5 3 4 -3 3 -4 1 4 0

 

提示:

用链表表示多项式

——————————————————————分割线——————————————————————

详细代码

  1 #define _CRT_SECURE_NO_WARNINGS 1
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 
  5 typedef struct Node{//要先命名结构体 要不然结构体内指针会报错
  6     Node* next;
  7     int x_up;
  8     float x_bottom;
  9 }Node;//结点的数据结构
 10 
 11 typedef struct {
 12     Node *head;
 13     int n;
 14 }list;//定义链表的结构体 包含头指针和节点个数n 头指针是结点类型的头指针
 15 //注意以上的定义顺序 先有结点再有列表 不然会报错
 16 list* creat_list() {//初始化链表
 17     list* l = (list*)malloc(sizeof(list));//要为列表分配空间malloc
 18     l->head = NULL;
 19     l->n = 0;
 20     return l;
 21 }
 22 //初始化结点但素这里的命名不太规范()
 23 Node* creat_Node(float x_b,int x_u) {//将结点的数据类型一一输入最后返回malloc的节点指针
 24     Node* new_Node;
 25     new_Node = (Node*)malloc(sizeof(Node));
 26     new_Node->x_bottom = x_b; new_Node->x_up = x_u;
 27     new_Node->next = NULL;
 28     return new_Node;
 29 }
 30 //尾插结点 分两种情况 链表为空 
 31 void add_Node(list* l,  int x_u, float x_b) {//尾插节点
 32     Node* newNode = creat_Node(x_b, x_u);
 33     if (l->head == NULL) {//链表为空(头指针为空时)
 34         l->head = newNode;
 35     }
 36     else {
 37         Node* tail = l->head;
 38         while (tail->next != NULL)
 39         {
 40             tail = tail->next;//如果不为空就步进,直到找到最后一个结点(next指针为空)
 41         }
 42         tail->next = newNode;//将尾部结点的next指向新结点
 43     }
 44 }
 45 //加函数  用列表实现功能的函数
 46 void add_list(list* A, list* B,list* l) {
 47     Node* cur_A, * cur_B;
 48     cur_A = A->head; cur_B = B->head;//现在当前结点指针为链表第一个
 49     while (1) {
 50         if (cur_A == NULL && cur_B == NULL) break;
 51         float x_b; int x_u;
 52         if (cur_A == NULL) {
 53             add_Node(l, cur_B->x_up, cur_B->x_bottom);
 54             cur_B = cur_B->next;
 55         }
 56         else if (cur_B == NULL) {
 57             add_Node(l, cur_A->x_up, cur_A->x_bottom);
 58             cur_A = cur_A->next;
 59         }
 60         else {
 61             if (cur_A->x_up == cur_B->x_up) {//AB指数相等,系数相加
 62                 if (cur_A->x_bottom + cur_B->x_bottom != 0) {
 63                     add_Node(l, cur_A->x_up, cur_A->x_bottom + cur_B->x_bottom);
 64                     cur_A = cur_A->next; cur_B = cur_B->next;
 65                 }
 66                 else {
 67                     cur_A = cur_A->next; cur_B = cur_B->next;
 68                     continue;
 69                 }
 70             }
 71             else if (cur_A->x_up > cur_B->x_up) {//A项的指数大
 72                 add_Node(l, cur_A->x_up, cur_A->x_bottom);
 73                 cur_A = cur_A->next;
 74             }
 75             else {//B项指数大
 76                 add_Node(l, cur_B->x_up, cur_B->x_bottom);
 77                 cur_B = cur_B->next;
 78             }
 79         }
 80         l->n++;
 81     }
 82 }
 83 
 84 void minus_list(list* A, list* B, list* l) {
 85     Node* cur_A, * cur_B;
 86     cur_A = A->head; cur_B = B->head;//现在当前结点指针为链表第一个
 87     while (1) {
 88         if (cur_A == NULL && cur_B == NULL) break;//当现在的指针都为空时,说明所有结点都处理完毕
 89         float x_b; int x_u;
 90         if (cur_A == NULL) {
 91             add_Node(l, cur_B->x_up, (-1) * cur_B->x_bottom);
 92             cur_B = cur_B->next;
 93         }
 94         else if (cur_B == NULL) {
 95             add_Node(l, cur_A->x_up, cur_A->x_bottom);
 96             cur_A = cur_A->next;
 97         }
 98         else {
 99             if (cur_A->x_up == cur_B->x_up) {//AB指数相等,系数相加
100                 if (cur_A->x_bottom - cur_B->x_bottom != 0) {//系数相减为零这项就gg 接着步进
101                     add_Node(l, cur_A->x_up, cur_A->x_bottom - cur_B->x_bottom);
102                     cur_A = cur_A->next; cur_B = cur_B->next;
103                 }
104                 else {
105                     cur_A = cur_A->next; cur_B = cur_B->next;
106                     continue;
107                 }
108             }
109             else if (cur_A->x_up > cur_B->x_up) {//A项的指数大
110                 add_Node(l, cur_A->x_up, cur_A->x_bottom);
111                 cur_A = cur_A->next;
112             }
113             else {//B项指数大
114                 add_Node(l, cur_B->x_up, (-1) * cur_B->x_bottom);
115                 cur_B = cur_B->next;
116             }
117         }
118         l->n++;
119     }
120 }
121 //打印链表
122 void print_list(Node* head) {
123     Node* node;
124     node = head;
125     while (node!= NULL) {
126         printf("%.0f %d ", node->x_bottom, node->x_up);
127         node = node->next;
128     }
129     printf("\n");
130 }
131 
132 int main() {
133     int n1, n2;
134     float x_b;//底数可能是小数
135     int x_u;//指数为整数
136     list* A, * B, * add, * minus;
137     A = creat_list();//初始化A、B链表
138     B = creat_list();//链表应该初始化(也就是分配空间)后才能使用 要不然编译器会报错 说找不到这块东东 
139     add = creat_list();
140     minus = creat_list();
141     scanf("%d", &n1);
142     A->n = n1;
143     for (int i = n1; i > 0; i--) {
144         scanf("%f %d", &x_b, &x_u);
145         add_Node(A, x_u, x_b);
146     }
147     scanf("%d", &n2);
148     B->n = n2;
149     for (int i = n2; i > 0; i--) {
150         scanf("%f %d", &x_b, &x_u);
151         add_Node(B, x_u, x_b);
152     }
153     add_list(A, B, add);
154     minus_list(A, B, minus);
155     printf("%d ", add->n);
156     print_list(add->head);
157     printf("%d ", minus->n);
158     print_list(minus->head);
159     return 0;
160 }

 

 盒盒盒 就这样吧