ZBLOG

#include #include 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; ...

根据你提供的代码,我发现在插入节点时存在一些问题导致超时。

具体来说,插入节点时使用了一个循环遍历链表找到合适的位置进行插入。这种方法在链表较长时会导致效率低下,并可能造成超时。

解决方法是可以考虑使用头插法或者尾插法构建有序链表,而不是遍历查找合适的位置。另外,在每次插入节点后要记得更新指针。

以下是修改后的代码:

#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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=8728

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?