在链表中查找两个最小元素

时间:2014-03-06 18:33:09

标签: c algorithm data-structures linked-list singly-linked-list

我正在尝试使用链表来增强我对指针的概念。

我已经成功创建了链表,它还提供了最少的两个元素,但我尝试了一些元素来测试它。

突然间我发现它不能用于以下例子:

enter the size of node
4
start entering the number of elements until your size
6
1
7
59
Printing linked list
6-> 1-> 7-> 59-> 

 The two minimumnumbers are  min1 :1   and min2 : 1

我的完整代码是:您可以直接切换到函数find_two_min()

#include <stdio.h> 
#include <stdlib.h> 
#include <malloc.h> 
#include <string.h>

struct node 
{
    int freq;
    struct node * next;
};
typedef struct node node;
node * tree;

//Problem creating area is below (code for finding minimum two elements)
void find_two_min(node**List,node** lmin1,node** lmin2)
{
    node*temp=*List;    
    node*min1,*min2;
    node*var1=*List;
    node* second=(*List)->next;
    if(var1>second)
    {
      min2=var1;
      min1=second;
    }
    else
    {
      min1=var1;
      min2 =second;
    }
    while(temp!=NULL)
    {
        if(temp->freq<min2->freq)
        {
            min1=min2;
            min2=temp;    
        }
        else if(temp->freq<min1->freq)
        {
            min1=temp;
        }    
        temp=temp->next;
    }
    *lmin1=min1; 
    *lmin2=min2;
}

void main() 
{
    int size, data;
    node* min1, *min2;
    int count = 0; //this count flag is to check is it's first node or not inside the do-while loop.
    tree = NULL;
    printf("enter the size of node\n");
    scanf("%d", & size);
    printf("start entering the number of elements until your size\n");
    node * prev;
    do
    {
        scanf("%d", & data);
        if (count == 0)
        {
            node * temp;
            temp = (node * ) malloc(sizeof(node));
            temp-> freq = data;
            temp-> next = NULL;
            prev = temp;
            tree=prev;
        } 
        else
        {
            node * temp ;
            temp = (node * ) malloc(sizeof(node));
            temp-> freq = data;
            temp-> next = NULL;
            prev-> next = temp;
            prev=prev->next;
        }
        size--;
        ++count;
    }
    while (size > 0);

    printf("Printing linked list\n");
    node * temp1;
    temp1 = tree;
    while (temp1!= NULL) 
    {
        printf("%d-> ", temp1-> freq);
        temp1 = temp1-> next;
    }
    node*temp5=tree;
    find_two_min(&temp5,&min1,&min2);
   printf("\n The two minimumnumbers are  min1 :%d   and min2 : %d\n",min1->freq,min2->freq);

}

任何人都可以让我知道为什么它没有在这个特定的例子上工作,而它正在研究其他样本?你能帮我纠正一下吗?

2 个答案:

答案 0 :(得分:6)

问题是你在开头min1作为第一个元素任意设置,min2作为第二个元素,然后 - 你开始遍历第一个元素(temp)。

这使你读取前两个元素两次,如果其中一个是最小值 - 它也被插入两次,算法'认为'你有两个值为1的元素。

这个问题的解决方案可能是遵循以下两种方法之一:

  1. min1min2设置为第一个元素后,检查哪个确实较小,然后仅从第3个元素开始遍历 - 避免重新读取已经读过的元素。
  2. (更好的解决方案)将min1min2设置为大于元素范围的值。一个很好的选择是使用INT_MAX - 它将确保从算法的第一步调用逻辑。

答案 1 :(得分:1)

你在第一个节点开始temp,即使你已经在初始化中考虑了它和第二个节点。尝试在第三个节点上启动它。