以最佳方法在链表中找到最小值

时间:2012-12-05 08:06:00

标签: c algorithm list linked-list

我遇到了这个问题,我们被要求存储字符串和否。与它相关联,我们应该从列表中删除最小数量(和它的字符串),并删除它后面存储的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;
    }

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

这里有一些代码问题:

  1. start=start->next;应该在每次迭代中完成,而不仅仅是在找到新的min时。
  2. 你总是错过列表的头部,迭代while(start != NULL)(并检查start->no而不是下一个节点。)(似乎start是一个虚拟变量,如果确实如此 - 你只是错过了它 - 这完全没问题。)
  3. 您缺少minimum()函数的返回类型,它不应该是void。如果您的列表包含int s,则返回类型应为int,当您耗尽循环时,您应该return min;。 (如果您有兴趣返回附加的最小字符串,请存储一个额外的变量char* minElement,在修改min时修改它,并在循环耗尽时返回它(minelement)。 / strike>(注意将答案存储在全局变量中是一种不好的做法,更好的方法是从函数中返回它)
  4. 您应该将min初始化为INT_MAX,而不是任意数字。

  5. 关于优化问题:

    如果您只对找到最小元素感兴趣,那么 heap是一个完全为它设计的数据结构!用于检索最小值的数据结构非常简单且非常有效。

    另请注意,如果您的数据结构不支持删除,则可以在每个插入中缓存min,这与此伪代码的行相似:

    添加到插入功能:

    if (newValue < min):
       min <- newValue
    

    和min很简单,就像检索缓存的min

    一样