文字列といいえを保存するように求められるこの問題に遭遇しました。それに関連付けられており、リストから最小の番号 (およびその文字列) を削除し、その後に格納されている番号 (および文字列) も削除することになっています。入力は、番号と文字列のペアのストリームであり、入力です。 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;
}
どんな助けでも大歓迎です。