题目是这样的
我的代码为:
#include<stdio.h>
#include<malloc.h>
#include<ctype.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int PolyTerm;
typedef struct PolyNode
{
PolyTerm coef;
PolyTerm exp;
struct PolyNode* next;
}PolyNode, * PolyLink;
Status ListInsert(PolyLink* L, PolyTerm coef, PolyTerm exp)
{
PolyLink p, s;
p = *L;
int j = 0;
for(;p;p=p->next)
{
if (p->exp == exp)
{
p->coef += coef;
break;
}
}
if (!p)
{
for (p = *L; p->next;p=p->next);
s = (PolyLink)malloc(sizeof(PolyNode));
if (s == NULL)
{
printf("分配内存失败");
return INFEASIBLE;
}
s->coef = coef;
s->exp = exp;
s->next = p->next;
p->next = s;
}
return OK;
}
Status SortbyEXP(PolyLink* L, int n)
{
PolyLink p = (*L)->next;
int i, j;
int temp;
for (j = 0; j < n - 1; j++)
{
for (i = 0; i < n - j - 1&&p->next; i++, p = p->next)
{
if (p->exp < p->next->exp)
{
temp = p->exp;
p->exp = p->next->exp;
p->next->exp = temp;
temp = p->coef;
p->coef = p->next->coef;
p->next->coef = temp;
}
}
p = (*L)->next;
}
return OK;
}
void DerivatePoly(PolyLink* L)
{
PolyLink p = (*L)->next, q = *L;
while (p)
{
p->coef *= p->exp;
p->exp--;
if (p->coef==0)
{
q->next = p->next;
free(p);
p = q->next;
}
else
{
p = p->next;
q = q->next;
}
}
}
void ShowList(PolyLink L)
{
PolyLink p = L->next;
int i = 0;
if (!p)
{
printf("0");
}
else
{
while (p)
{
if (p->exp == 0)
{
if (p->coef > 0 && i)
printf("+ ");
else if (p->coef < 0)
{
printf("- ");
p->coef *= -1;
}
printf("%d ",p->coef);
}
else if (p->exp == 1)
{
if (p->coef > 0&&i)
printf("+ ");
else if(p->coef<0)
{
printf("- ");
p->coef *= -1;
}
printf("%dx ", p->coef);
}
else
{
if (p->coef > 0&&i)
printf("+ ");
else if (p->coef < 0)
{
printf("- ");
p->coef *= -1;
}
printf("%dx^%d ", p->coef, p->exp);
}
i = 1;
p = p->next;
}
}
}
main()
{
PolyLink L = (PolyLink)malloc(sizeof(PolyNode));
L->next = NULL;
int coef=0,exp=0, sign = 1,i=0;
char c=getchar();
while (1)
{
if (c == '-' || c == '+')
{
if (exp == 0 && coef != 0)
{
ListInsert(&L, sign * coef, 0);
coef = 0;
sign = 1;
i++;
}
if (c == '-')
sign = -1;
c = getchar();
}
else if (isdigit(c))
{
coef = c - '0';
while (isdigit(c = getchar()))
coef = 10 * coef + c - '0';
if (c == '\n')
{
ListInsert(&L, coef, 0);
coef = 0;
sign = 1;
i++;
break;
}
}
else if (c == 'x')
{
if (coef == 0)
coef = 1;
if ((c = getchar()) != '^')
{
ListInsert(&L, coef * sign, 1);
i++;
coef = 0;
sign = 1;
if (c == '\n')
break;
}
}
else if (c == '^')
{
while (isdigit(c = getchar()))
exp = 10 * exp + c - '0';
ListInsert(&L, coef * sign, exp);
i++;
if (c == '\n')
break;
coef = 0;
exp = 0;
sign = 1;
}
else if (c == '\n')
break;
else
c = getchar();
}
SortbyEXP(&L,i);
DerivatePoly(&L);
ShowList(L);
}
本地跑没问题,但OJ显示运行时出错
检查过int和Status类型函数都有返回值
你确定这个代码本地能跑?指针全都是乱用,跑得起才是怪事
该回答引用ChatGPT
以下可能是导致错误的原因:
1、在使用malloc()函数分配内存时,应该检查是否成功分配内存。如果分配失败,应该返回INFEASIBLE或OVERFLOW。您的代码没有检查malloc()函数是否成功,可能导致内存分配失败而导致错误。
2、在函数main()中,没有指定函数的返回类型。在C语言中,main()函数的返回类型应该是int。这可能导致错误。
3、您的代码中使用了头文件<malloc.h>,这个头文件不是标准的C语言头文件。在某些编译器中,可能没有这个头文件,这可能导致错误。
4、如果您的代码使用了其他头文件,但未在代码中包含,也可能导致错误。
头文件中没有声明malloc函数,需要添加#include<stdlib.h>
代码中的一些空格是中文输入法的空格,需要手动修改为英文空格。
最重要的问题是:输入多项式时,当用户完成最后一项的输入后,并且输入最后一个字符回车后,这个回车符会被程序读入,导致它被作为下次循环的输入,从而程序无法退出输入循环,且会卡在最后的显示结果处。
所以我们在代码中加入一个状态机解决这个问题。
参考GPT和自己的思路,在代码的第9行,typedef 中的 PolyNodef 应改为 PolyNode。
在 DerivatePoly 函数中,当多项式项的系数为 0 时,需要删除这个节点。但在删除节点之后,p 继续指向下一个节点,而不是原来的 p->next。因此,在 p 与 q 的赋值中,需要将 p 赋值为 q->next。
在 ShowList 函数中,需要判断最后一项的系数是否为 0,如果为 0,需要将这一项删除。
另外,在代码中有许多拼写错误和语法错误,需要仔细检查。
在您的代码中,ListInsert函数中没有为L分配内存,因此在调用此函数时会发生运行时错误。您需要在主函数中为L分配内存。此外,在从标准输入读取多项式时,您需要处理第一项可能不带符号的情况。
另外,在SortbyEXP函数中,您需要将p和q分别初始化为(L)->next和L,以便在链表的头部删除节点时保留正确的指针。
最后,在输出多项式时,您可以在第一项前不打印符号,而不是在第二项后打印符号,这会更好看。同时,对于导数为0的情况,您需要输出一个只包含0的多项式。
该回答引用GPTᴼᴾᴱᴺᴬᴵ
在您的代码中,我注意到有两个问题导致 OJ 运行时错误。
·
首先,当链表为空时,不能使用p->next,因为 p 为 NULL。此时需要先检查链表是否为空,如果为空则直接将新结点作为链表的头结点即可。
·
其次,由于链表的排序算法实现不正确,导致程序出现了错误。在排序时,由于只是交换相邻结点的数据,所以无法对整个链表进行排序。