根据你提供的代码,我发现在插入节点时存在一些问题导致超时。
具体来说,插入节点时使用了一个循环遍历链表找到合适的位置进行插入。这种方法在链表较长时会导致效率低下,并可能造成超时。
解决方法是可以考虑使用头插法或者尾插法构建有序链表,而不是遍历查找合适的位置。另外,在每次插入节点后要记得更新指针。
以下是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
double X;
int Z;
struct node* next;
} Node;
int InitNode(Node** head) {
*head = (Node*)malloc(sizeof(Node));
if (*head == NULL) return 0;
(*head)->next = NULL;
(*head)->X = 0.0;
(*head)->Z = 0;
return 1;
}
void creat(Node* head) {
Node* r = head, *s; //r为遍历指针
int a, b = 1;
while (1) {
s = (Node*)malloc(sizeof(Node));
scanf("%d,%d", &a, &b);
if (a == 0 && b == 0) break;
s->X = a;
s->Z = b;
while (r->next != NULL && s->Z <= r->next->Z) {
if (s->Z == r->next->Z) {
r->next->X += s->X;
free(s);
return; // 插入完成后直接返回,不再继续遍历
}
r = r->next;
}
s->next = r->next;
r->next = s;
}
}
void output(Node* head) {
Node* p = head->next;
printf("f(X)=");
int isFirstTermPrinted = 0;
while (p != NULL) {
if (p->X != 0.0) {
if (!isFirstTermPrinted) {
if (p->Z == 0)
printf("%.1f", p->X);
else if (p->Z == 1 && p->X == 1.0)
printf("X");
else if (p->Z == 1)
printf("%.1fX", p->X);
else
printf("%.1fX^%d", p->X, p->Z);
isFirstTermPrinted = 1;
} else {
if (p->X > 0)
printf("+");
else {
printf("-");
p->X *= -1;
}
if (p->X == 1 && p->Z == 0)
printf("%.1f", p->X);
else if (p->X == 1 && p->Z == 1)
printf("X");
else if (p->X == 1 && p->Z != 0 && p -> Z!= 1)
printf("X^%d", p -> Z);
else if (p -> Z==1)
printf("%.1fX", p -> X);
else
printf("%.1f*X^%d", p -> X, p -> Z);
}
}
p = p -> next;
}
if (!isFirstTermPrinted)
printf("0.0");
printf("\n");
}
void free1(Node* head){
Node* p=head,*q;
while(p!=NULL){
q=p->next;
free(p);
p=q;
}
head=NULL;
}
int main() {
Node* head;
if (!InitNode(&head)) {
printf("Initialization failed.\n");
return 0;
}
creat(head);
output(head);
free1(head);
return 0;
}
通过上述修改,可以避免不必要的遍历,提高效率,并解决超时问题。
内容由零声教学AI助手提供,问题来源于学员提问




