在学校平台上有道题
题目描述
输入一个正整数序列,遇负数时停止,建立一个线性链表存储读入的数据,然后从键盘读入一数据x,在该链表中删除比x大的数据后输出。
输入
单组测试数据
第一行输入很多个整数,最后一个是负数,其他都是正数
第二行输入一个整数x
输出
按照输入的顺序,输出删除后链表的值
样例输入 Copy
1 2 3 4 5 -1
3
样例输出 Copy
1 2 3
#include
#include
typedef struct line
{
int num;
struct line *next;
}Line;
void inside(Line*head,int num)//尾插
{
Line*news=(Line*)malloc(sizeof(Line));
news->num=num;
news->next=NULL;
Line*q;
q=head;
while(q->next!=NULL)
{
q=q->next;
}
q->next=news;
}
int main(void)
{
Line*head=(Line*)malloc(sizeof(Line));
head->next=NULL;
Line*p;
p=head;
int i,x;
scanf("%d",&i);
while(i>=0)
{
inside(head,i);
scanf("%d",&i);
}
scanf("%d",&x);
for(;p!=NULL;p=p->next)
{
if((p->num)<=x)
{
printf("%d ",p->num);
}
}
printf("\n");
return 0;
}
这是我的做法本机运行没问题,但是交上去就是时间超限,是什么问题
有一些潜在的问题可能会导致您的代码超过时间限制:
最可能的问题是您正在使用线性搜索算法来查找链表中小于或等于 的元素x。这意味着你的算法的时间复杂度是 O(n),其中 n 是链表中元素的数量。如果链接列表非常大,这可能会导致超过时间限制。
另一个问题可能是在函数中使用malloc和使用动态内存分配。这些函数可能相对较慢,并且会增加程序的开销,尤其是在频繁调用它们的情况下。freeinside
使用scanf和printf还会增加程序的开销,尤其是在频繁调用它们的情况下。您可能需要考虑使用更快的输入/输出函数,例如fread和fwrite。
为了优化代码的性能,您可能需要考虑使用更快的算法来搜索链表,最大限度地减少动态内存分配的使用并优化您的输入/输出操作。如果更适合您的需要,您可能还想考虑使用不同的数据结构,例如数组或平衡树。