任务描述 本关任务:用链表封装多项式,并且实现其数学运算。 相关知识 为了完成本关任务,你需要掌握:1.封装特定类型的单链表,2.如何遍历链表和逐步产生新链表 封装特定类型的单链表结点 单链表的不同,在于数据成员的不同,在理论课教学时,我们的封装为: typedef struct Node{ ElemType data; Node* next; }Node; 在实际应用时,我们需要将ElemType替换成实际需要的数据类型。 对于多项式链表来说,我们需要替换成一个项的系数和指数 typedef struct Node{ double coef; int exp; Node* next }Node; 封装多项式链表 为了方便在链表尾部插入元素,我们可以设置尾指针tail typedef struct { //定义多项式 Node* head, * tail; }Poly; 创建多项式链表 创建多项式链表,需要创建头结点,并且将头尾指针均指向头结点 Poly* create_poly() { Poly* poly = (Poly*)malloc(sizeof(Poly)); poly->head = (Node*)malloc(sizeof(Node));//带头结点的链表 poly->head->next = NULL; poly->tail = poly->head; return Poly; } 添加单项(链表结点) 无论是创建输入对象,还是运算结果,都需要能够在链表尾部添加项。为此,需要实现多项式链表的添加项的功能。 void add_node(Poly* poly, int coef, int exp) {//增加一项 Node* node = (Node*)malloc(sizeof(Node)); node->coef = coef; node->exp = exp; node->next = NULL; poly->tail->next = node; poly->tail = node; } 通过解析输入字符串,创建多项式(链表) 本项目要求输入多项式的字符串,所以需要逐个字符读取,分解为系数、指数、底、连接符号。 通过观察和题目描述,我们可以在读入底x的时候,完成一个项的创建 Poly* create_poly_by(char* s) {//通过多项式式字符串,创建多项式 Poly* poly = create_poly(); int coef = 1; char ch; while (ch = (s++)) { //处理表达式每个字符,可能是+-,数字,或者x或者^ if (ch >= '0' && ch <= '9') coef *= ch - '0'; else if (ch == '-')//系数为负,取反 coef = -1; else if (ch == '^') { ch = *(s++); add_node(poly, coef, ch - '0');//指数读完即加入多项式 coef = 1; } } return poly; } 输出多项式 void print_poly(Poly* poly) {//输出多项式 struct Node* p = poly->head->next; if (p == NULL) printf("None"); while (p) {//遍历输出每一项 if (p->coef > 0 && p != poly->head->next) printf("+");//非第一项,系数非负,则用+连接 printf("%.f", p->coef); if (p->exp) printf("x^%d", p->exp); p = p->next; } printf("\n"); } 完成多项式运算 Poly add(Poly* A, Poly* B) { //TODO:在这里完成多项式加法 return NULL; } Poly* sub(Poly* A, Poly* B) { //TODO:在这里完成多项式减法 return NULL; } Poly* mul(Poly* A, Poly* B) { //TODO:在这里完成多项式乘法 return NULL; } 处理输入输出 int main() { char sa[100], sb[100], op; scanf("%s\n%s\n%c", sa, sb, &op); Poly* A = create_poly_by(sa); Poly* B = create_poly_by(sb); Poly* C = NULL; if (op=='+') C=add(A,B); //TODO:调用减法、乘法 print_poly(C); return 0; }
注意,指数升幂排序