我遇到了这个问题,我们被要求存储字符串和否。与它相关联,我们应该从列表中删除最小数量(和它的字符串),并删除它后面存储的no.s(和字符串)。输入是一个数字,字符串对和输入的流-1表示我们需要从列表中删除samllest以及它上面的对。输出应该是最小编号项目之上的项目数。 例如2 abcd 1 aabb 3 dbbb -1 o / p 1(因为最小值为1 aabb,后面只有一个项目,即3 dbbb;我们的列表现在只包含2个abcd)。 另一个-1将产生o / p 0。 我使用链表尝试了这个,但似乎需要比预期更多的时间。我需要一个更好的数据结构或算法。 这是我的代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct data
{
int no,pos;
char *st;
struct data *next;
}data;
void insert(data *start,int n,char *s);
void minimum(data *start);
int total=0,min=100001,posn=0;//total=total no of nodes,rem=nodes after minimum
data *temp;
int main()
{
int N,n;
data *start;
start=(data*)malloc(sizeof(data));
start->pos=0;
start->no=100002;
start->next=NULL;
char c,s[16];
scanf("%d",&N);
while(N)
{
scanf("%d",&n);
if(n!=-1)
{
scanf("%c",&c);
scanf("%s",s);
total++;
posn++;
insert(start,n,s);
}
else
{
printf("%d %s\n",total-(temp->next->pos),temp->next->st);
posn=temp->pos;
total=temp->pos;
temp->next=NULL;
minimum(start);
}
N--;
}
}
void insert(data *start,int n,char *s)
{
while(start->next!=NULL)
start=start->next;
if(n<=min)
{
temp=start;
min=n;
}
start->next=(data*)malloc(sizeof(data));
start=start->next;
start->no=n;
start->st=(char*)malloc(sizeof(char)*(strlen(s)));
strcpy(start->st,s);
start->pos=posn;
start->next=NULL;
return;
}
void minimum(data *start)
{
min=100001;
while(start->next!=NULL)
{
if(start->next->no<=min)
{
min=start->next->no;
temp=start;
start=start->next;
}
}
return;
}
任何帮助都将不胜感激。
答案 0 :(得分:0)
这里有一些代码问题:
start=start->next;
应该在每次迭代中完成,而不仅仅是在找到新的min时。while(start != NULL)
(并检查start->no
而不是下一个节点。)start
是一个虚拟变量,如果确实如此 - 你只是错过了它 - 这完全没问题。)minimum()
函数的返回类型,它不应该是void
。如果您的列表包含int
s,则返回类型应为int
,当您耗尽循环时,您应该return min;
。 (如果您有兴趣返回附加的最小字符串,请存储一个额外的变量char* minElement
,在修改min
时修改它,并在循环耗尽时返回它(minelement
)。 / strike>(注意将答案存储在全局变量中是一种不好的做法,更好的方法是从函数中返回它)INT_MAX
,而不是任意数字。关于优化问题:
如果您只对找到最小元素感兴趣,那么 heap是一个完全为它设计的数据结构!用于检索最小值的数据结构非常简单且非常有效。
另请注意,如果您的数据结构不支持删除,则可以在每个插入中缓存min,这与此伪代码的行相似:
添加到插入功能:
if (newValue < min):
min <- newValue
和min很简单,就像检索缓存的min
。