我遇到了这个问题,我们被要求存储一个字符串和一个否。与它相关联,我们应该从列表中删除最小编号(及其字符串),并删除存储在它之后的编号(和字符串)。输入是编号,字符串对和输入的流of -1 表示我们需要从列表中删除最少量的及其上方的对。输出应该是最小编号项目上方的项目数。例如 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;
}
任何帮助,将不胜感激。