C 用最优化方法求链表中的最小值

C 用最优化方法求链表中的最小值,c,algorithm,list,linked-list,C,Algorithm,List,Linked List,我遇到了一个问题,我们被要求存储一个字符串和一个与之相关的编号,我们应该从列表中删除最小编号及其字符串,并删除其后存储的编号和字符串。输入是一个编号流。,字符串对和-1的输入意味着我们需要从列表及其上方的对中删除samllest。输出应该是最小编号项目上方的项目计数。 e、 g.2 abcd 1 aabb 3 dbbb -1 o/p 1,因为最小值为1 aabb,且之后只有一项,即3 dbbb;我们的列表现在只包含2个abcd。 另一个-1将产生o/p 0。 我已经尝试过使用链表,但它似乎比预期

我遇到了一个问题,我们被要求存储一个字符串和一个与之相关的编号,我们应该从列表中删除最小编号及其字符串,并删除其后存储的编号和字符串。输入是一个编号流。,字符串对和-1的输入意味着我们需要从列表及其上方的对中删除samllest。输出应该是最小编号项目上方的项目计数。 e、 g.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;
    }

任何帮助都将不胜感激。

您的代码有一些问题:

开始=开始->下一步;应该在每次迭代中完成,而不仅仅是在找到新的min时。 您总是缺少列表的标题,在开始时迭代!=NULL并选中开始->否,而不是下一个节点。start似乎是一个伪变量,如果确实是这样的话——您只是缺少它——这是非常好的。 您缺少最小函数的返回类型,它不应为空。如果您的列表包含int,则返回类型应为int,当您耗尽循环时,应返回min;。如果您有兴趣返回附加的min字符串,请存储一个额外的变量char*minElement,在修改min时对其进行修改,并在循环耗尽时返回minElement。注意,将答案存储在全局变量中是一种不好的做法,更好的方法是从函数返回答案 您应该将min初始化为INT_MAX,而不是任意数字。 关于优化问题:

如果您只对查找最小元素感兴趣,那么a是一种专为它设计的数据结构!它是检索最小值的简单而有效的数据结构

另外请注意,如果您的数据结构不支持删除,则可以在每次插入中缓存min,类似于以下伪代码:

添加到插入功能:

if (newValue < min):
   min <- newValue

min很简单,只需检索缓存的min.

也不清楚为什么min值从100001开始,而不是从INT_MAX开始。把min变成一个全局变量也是个坏主意;说明您没有为以后执行的strcpy上的\0字符留出空间。除非您知道这些值是按顺序排列的,例如存储在树结构或排序列表中,并且您可以更快地获取最小值或最大值,否则很难在不到时间内找到一组N值中的最小值。遍历链表是一个ON操作;如果你修改了你的代码,那么它是在一个恒定的最佳因素之内。或者为什么不设置min=start->no,这显然是目前正在跳过的,所以如果最小值恰好在第一个节点中,它就找不到了。你说的不是正在进行的比赛中的这个问题吗?来吧!!公平地说,关于minimum的返回类型,我不需要返回任何东西。我将minimum节点存储在temp变量中,我认为这与optimization@AmanAgarwal字体哦,我现在看到了。请注意,这是一种不好的做法,更好的做法是返回temp,而不是将其存储在全局变量中。在我的情况下,heap不起作用,因为我还需要删除在最小值之后插入的元素。