我正在尝试使用链表来增强我对指针的概念。
我已经成功创建了链表,它还提供了最少的两个元素,但我尝试了一些元素来测试它。
突然间我发现它不能用于以下例子:
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);
}
任何人都可以让我知道为什么它没有在这个特定的例子上工作,而它正在研究其他样本?你能帮我纠正一下吗?
答案 0 :(得分:6)
问题是你在开头min1
作为第一个元素任意设置,min2
作为第二个元素,然后 - 你开始遍历第一个元素(temp
)。
这使你读取前两个元素两次,如果其中一个是最小值 - 它也被插入两次,算法'认为'你有两个值为1的元素。
这个问题的解决方案可能是遵循以下两种方法之一:
min1
和min2
设置为第一个元素后,检查哪个确实较小,然后仅从第3个元素开始遍历 - 避免重新读取已经读过的元素。min1
和min2
设置为大于元素范围的值。一个很好的选择是使用INT_MAX
- 它将确保从算法的第一步调用逻辑。答案 1 :(得分:1)
你在第一个节点开始temp
,即使你已经在初始化中考虑了它和第二个节点。尝试在第三个节点上启动它。