我有一个包含变量x、y和z的多项式的结构
struct Node
{
float coeff;
int powX;
int powY;
int powZ;
struct Node* next;
};
我想读取形式为powX
powY
powZ
coeff
的多项式的n
用户输入,我有一个for
循环的实现,但它会给我带来分割错误。可能是什么问题?
void readPolynomial(struct Node** poly)
{
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
*poly = temp;
int terms;
fscanf(stdin, "%d", &terms);
getchar();
char entry[200];
char * splitter;
for(int i = 0; i < terms; i++)
{
fgets(entry, 200, stdin);
splitter = strtok(entry," ");
temp->powX = atoi(splitter);
splitter = strtok(NULL, " ");
temp->powY = atoi(splitter);
splitter = strtok(NULL, " ");
temp->powZ = atoi(splitter);
splitter = strtok(NULL, " ");
temp->coeff = atof(splitter);
temp->next = NULL;
if(i != terms-1)
{
temp->next = (struct Node*)malloc(sizeof(struct Node));
temp = temp->next;
temp->next = NULL;
}
}
}
这是我的主要功能:
int main()
{
struct Node* first = NULL;
readPolynomial(&first);
return 0;
}
对于多项式4x⁵y⁴z²
:5 4 2 4
样本输入:
3
5 4 2 4
1 6 0 -7
1 0 1 9
完整代码函数:获取两个多项式的和,按规范顺序打印
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct Node
{
float coeff;
int powX;
int powY;
int powZ;
struct Node* next;
};
void readPolynomial(struct Node** poly)
{
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
*poly = temp;
int terms;
fscanf(stdin, "%d", &terms);
getchar();
char entry[200];
char *splitter;
for(int i = 0; i < terms; i++)
{
fgets(entry, 200, stdin);
splitter = strtok(entry," ");
temp->powX = atoi(splitter);
splitter = strtok(NULL, " ");
temp->powY = atoi(splitter);
splitter = strtok(NULL, " ");
temp->powZ = atoi(splitter);
splitter = strtok(NULL, " ");
temp->coeff = atof(splitter);
temp->next = NULL;
if(i != terms-1)
{
temp->next = (struct Node*)malloc(sizeof(struct Node));
temp = temp->next;
temp->next = NULL;
}
}
}
int degree(struct Node *term) {
return (term->powX*pow(10, 2)) + (term->powY*pow(10, 1)) + (term->powZ*pow(10, 0));
}
int termCount(struct Node* poly)
{
int count = 0;
while(poly != NULL)
{
count++;
poly = poly->next;
}
return count;
}
void displayPolynomial(struct Node* poly)
{
int c = termCount(poly);
struct Node *temp1, *t, *temp2;
int tempX, tempY, tempZ, tempCoeff;
for(int i = c-2; i>= 0; i--)
{
temp1 = poly;
temp2 = temp1->next;
for(int j = 0; j <= i; j++)
{
if(degree(temp1) < degree(temp2))
{
tempX = temp1->powX;
tempY = temp1->powY;
tempZ = temp1->powZ;
tempCoeff = temp1->coeff;
temp1->powX = temp2->powX;
temp1->powY = temp2->powY;
temp1->powZ = temp2->powZ;
temp1->coeff = temp2->coeff;
temp2->powX = tempX;
temp2->powY = tempY;
temp2->powZ = tempZ;
temp2->coeff = tempCoeff;
}
temp1 = temp2;
temp2 = temp2->next;
}
}
t = poly;
while(t != NULL)
{
printf("%d %d %d %.3fn", t->powX, t->powY, t->powZ, t->coeff);
t = t->next;
}
}
void addPolynomials(struct Node** result, struct Node* first, struct Node* second)
{
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
temp->next = NULL;
*result = temp;
while(first && second)
{
if(((first->powX*pow(10, 2)) + (first->powY*pow(10, 1)) + (first->powZ*pow(10, 0))) < (((second->powX*pow(10, 2)) + (second->powY*pow(10, 1)) + (second->powZ*pow(10, 0)))))
{
temp->coeff = second->coeff;
temp->powX = second->powX;
temp->powY = second->powY;
temp->powZ = second->powZ;
second = second->next;
}
else if(((first->powX*pow(10, 2)) + (first->powY*pow(10, 1)) + (first->powZ*pow(10, 0))) > (((second->powX*pow(10, 2)) + (second->powY*pow(10, 1)) + (second->powZ*pow(10, 0)))))
{
temp->coeff = first->coeff;
temp->powX = first->powX;
temp->powY = first->powY;
temp->powZ = first->powZ;
first = first->next;
}
else
{
temp->coeff = first->coeff + second->coeff;
temp->powX = first->powX;
temp->powY = first->powY;
temp->powZ = first->powZ;
first = first->next;
second = second->next;
}
if(first && second)
{
temp->next = (struct Node*)malloc(sizeof(struct Node));
temp = temp->next;
temp->next = NULL;
}
}
while(first || second)
{
temp->next = (struct Node*)malloc(sizeof(struct Node));
temp = temp->next;
temp->next = NULL;
if(second)
{
temp->coeff = second->coeff;
temp->powX = second->powX;
temp->powY = second->powY;
temp->powZ = second->powZ;
second = second->next;
}
else if(first)
{
temp->coeff = first->coeff;
temp->powX = first->powX;
temp->powY = first->powY;
temp->powZ = first->powZ;
first = first->next;
}
}
}
int main()
{
struct Node* first = NULL;
struct Node* second = NULL;
struct Node* result = NULL;
readPolynomial(&first);
readPolynomial(&second);
addPolynomials(&result, first, second);
displayPolynomial(result);
return 0;
}
样本输入:
3
1 6 0 -7
0 7 0 -6
7 0 0 1
5
1 0 1 9
0 7 0 -2
5 3 2 4
1 2 3 4
1 3 0 3
样本输出:
7 0 0 1.000
5 3 2 4.000
1 6 0 -7.000
1 3 0 3.000
1 2 3 4.000
1 0 1 9.000
0 7 0 -8.000
编译时带有完整警告(在gcc中为-Wall -Wextra
(。
在这种情况下,您将看到您没有包含<string.h>
,C允许隐式声明(int (*)()
(,但行为不是您想要的。
将以下内容添加到您的代码中,
#include <string.h>