昌邑市宋庄地图:数据结构c++的问题!!!

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/05 01:50:38
请写出计算两个以单链接表表示的多项式相乘的程序.

使用方法:
./poly_multiply <poly_in1> <poly_in2> <poly_out>

示例:
./poly_multiply a.txt b.txt c.txt

其中,输入文件为a.txt和b.txt,其内容分别为:

a.txt:
9.1*x^3-6.2*x^2+7.3*x-2.5

b.txt:
3.1*x+5.3

输出文件为c.txt,其结果内容为:

c.txt:
28.21*x^4+29.01*x^3-10.23*x^2+30.94*x-13.25

程序源码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct slnode
{
slnode *next;
int power;
double coef;
}
*slist;

slnode *create_node(int power, double coef)
{
if (power < 0 || coef == 0)
return NULL;
slnode *new_node = (slnode *)malloc(sizeof(slnode));
if (new_node)
{
new_node->next = NULL;
new_node->power = power;
new_node->coef = coef;
}
return new_node;
}

slist *search_node(slist *lst, int power)
{
slist *cur = lst;
while (*cur)
{
if ((*cur)->power == power)
break;
cur = &((*cur)->next);
}
return cur;
}

void load_poly(char *filename, slist *lst)
{
*lst = NULL;
FILE *fp = fopen(filename, "r");
if (!fp) return;
slist *tail = lst;
int power;
double coef;
int read_num;
char buf[2];
while ((read_num = fscanf(fp, " %lf * %1[x] ^ %d", &coef, buf, &power)) >= 1)
{
if (read_num == 1)
{
power = 0;
}
else if (read_num == 2)
{
power = 1;
}
//printf("%d %lf\n", power, coef);
slnode *new_node = create_node(power, coef);
if (!new_node)
continue;
*tail = new_node;
tail = &((*tail)->next);
}
fclose(fp);
}

void print_poly(FILE *fp, slist lst)
{
bool is_first = true;
while (lst)
{
if (is_first)
{
is_first = false;
fprintf(fp, "%lg", lst->coef);
}
else
{
fprintf(fp, "%+lg", lst->coef);
}
if (lst->power != 0)
fprintf(fp, "*x");
if (lst->power != 0 && lst->power != 1)
fprintf(fp, "^%d", lst->power);
lst = lst->next;
}
fprintf(fp, "\n");
}

void free_poly(slist *lst)
{
while (*lst)
{
slist tmp = *lst;
*lst = (*lst)->next;
free(tmp);
}
}

void poly_multiply(slist a, slist b, slist *c)
{
*c = NULL;
for (slist a_cur = a; a_cur; a_cur = a_cur->next)
for (slist b_cur = b; b_cur; b_cur = b_cur->next)
{
int power = a_cur->power + b_cur->power;
double coef = a_cur->coef * b_cur->coef;
slist *pos = search_node(c, power);
if (*pos)
{
(*pos)->coef += coef;
if ((*pos)->coef == 0)
{
slist tmp = *pos;
*pos = (*pos)->next;
free(tmp);
}
}
else
{
slnode *new_node = create_node(power, coef);
if (!new_node)
continue;
*pos = new_node;
}
}
}

void write_poly(char *filename, slist lst)
{
FILE *fp = fopen(filename, "w");
if (!fp) return;
print_poly(fp, lst);
fclose(fp);
}

int main(int argc, char **argv)
{
if (argc < 4)
{
fprintf(stderr, "Usage: %s <poly_in1> <poly_in2> <poly_out>\n", argv[0]);
return 1;
}
slist lst_a = NULL, lst_b = NULL, lst_c = NULL;
load_poly(argv[1], &lst_a);
load_poly(argv[2], &lst_b);
print_poly(stdout, lst_a);
print_poly(stdout, lst_b);
poly_multiply(lst_a, lst_b, &lst_c);
print_poly(stdout, lst_c);
write_poly(argv[3], lst_c);
free_poly(&lst_a);
free_poly(&lst_b);
free_poly(&lst_c);
return 0;
}

我正好做过这个程序,被老师评为“优”。
给我发个Email,我把源程序代码发到你邮箱吧。
bearscafe@163.com
加我QQ也行。12111432