- 论坛徽章:
- 0
|
1. C语言总复习:略 2.链表作业: 利用链表进行多项式合并,例如: Y1:5+6x+8x^2+32x^3 Y2: 2x-8x^2+16x^4 合并: 5+8x+32x^3+16x^4
multinomial.c
#include <stdio.h> #include <stdlib.h> #include <string.h>
#define TIME 4
typedef struct NODE_ST_Y{ char sign; int value; int power; struct NODE_ST_Y *next; }node_st_y;
int add(node_st_y **root, node_st_y data) {
node_st_y *new; node_st_y *current; current = *root;
new = malloc(sizeof(*new)); *new = data; new->next = NULL; if(*root == NULL) { (*root) = new; return 0; } while(current->next != NULL) current = current->next; current->next = new; return 0;
}
int delete(node_st_y **root, node_st_y data) { node_st_y *current = *root; node_st_y *previous = *root; while(current != NULL) { if(data.value == current->value) { previous->next = current->next; free(current); return 0; } previous = current; current = current->next; } return -1;
}
int insert(node_st_y **root, node_st_y data) { node_st_y *new; new = malloc(sizeof(*new)); *new = data;
node_st_y *current = *root; node_st_y *previous = *root; while(current != NULL) { if(new->power < current->power) { new->next = current; previous->next = new; return 0; } previous = current; current = current->next; } add(root,data); }
int display(node_st_y *root) { while(root != NULL) { printf("+(%dx%d)", root->value, root->power); root = root->next; } return 0; }
int input(node_st_y *data) { char buffer[20]; int i=0; fgets(buffer,20,stdin); if(buffer[0] == '\n') { return -1; } if(isalnum(buffer[0])) { for(i=19;i>0;i--) buffer[i]=buffer[i-1]; buffer[0]=' '; } sscanf(buffer, "%c%dx%d\n", &data->sign, &data->value ,&data->power); if(data->sign == '-') data->value *= -1; return 0; }
int together(node_st_y **Y1, node_st_y *Y2) { node_st_y *current_Y1; node_st_y *current_Y2; node_st_y data; current_Y2 = Y2; int flag = 0; while(current_Y2 != NULL) { flag = 0; current_Y1 = *Y1; while(current_Y1 != NULL) { if(current_Y1->power == current_Y2->power){ current_Y1->value += current_Y2->value; if(current_Y1->value == 0) delete(Y1, *current_Y1); flag = 1; break; } current_Y1 = current_Y1->next; } if(flag ==0) insert(Y1, *current_Y2); current_Y2 = current_Y2->next; } return 0; }
int destroy(node_st_y *Y) { node_st_y *previous ; if(Y == NULL) return -1; while(Y != NULL) { previous = Y; free(Y); Y = Y->next; } return 0; }
void clear_data(node_st_y *data) { data->sign = ' '; data->value = 0; data->power = 0; }
int main(void) { node_st_y data; node_st_y *Y1 = NULL; node_st_y *Y2 = NULL;
int i; printf("Input Y1:\n"); for(i=0;i<TIME;i++) { clear_data(&data); if(input(&data)==-1) break; add(&Y1,data); } printf("Input Y2:\n"); for(i=0;i<TIME;i++) { clear_data(&data); if(input(&data)==-1) break; add(&Y2,data); } printf("\nY1 :"); display(Y1); printf("\nY2 :"); display(Y2); if(!together(&Y1,Y2)) { printf("\nNew Y1:"); display(Y1); } printf("\n"); destroy(Y1); destroy(Y2); }
|
|