C ++顺序搜索没有找到最后一个元素

时间:2010-12-09 15:24:38

标签: c++ search sequential

所以我有一个输入文件。它由40个数字组成。前20个数字输入到一个数组中(我已经检查过它们,它们实际上就在那里)。然后我关闭并重新打开输入文件。我使用顺序搜索将输入文件中的前20个数字与我的数组进行比较。这意味着他们都应该成功。然后我将接下来的20个数字与我的数组中的数字进行比较,它们都应该是不成功的搜索。我的数组此时未分类。

我遇到的问题是,使用顺序从未找到成功的最后一个数字。我不知道如何解决这个问题。

以下是顺序搜索功能:

length = 19;

void Search::sequential(ItemType item, bool& found)
{ 
  int place = 0;
  while (place < length && item != list[place])
    place++;
  found = (place < length); 
}

这是我成功/不成功的循环

outFile << "\n\n ************Sequential Successful ********** \n";
outFile << endl << "ID" << endl;

inFile >> num;
for(int i=0; i<=length && inFile; i++)
{
  search.sequential(num, found);
  if (found)
    outFile << num << endl; 

  inFile >> num;
} 


//sequential unsuccessful
outFile << "\n\n ************Sequential unsuccessful ********** \n";
outFile << endl << "ID" << endl;

for(int i=0; i<=length && inFile; i++)
{
  search.sequential(num, found);
  if (!found)
    outFile << num << endl; 

  inFile >> num;
}

但是,我的输出是:

 ************Sequential Successful ********** 

 ID
 1111
 3352
 4567
 5678
 6789
 7890
 8901
 9012
 1223
 2113
 8546
 2374
 4723
 9573
 3284
 7474
 8594
 3589
 5858
 //THERE SHOULD BE 1925 HERE BUT THERE ISN'T

  ************Sequential unsuccessful ********** 

 ID
 9456
 3584
 2222
 4319
 4477
 5710
 5497
 1502
 1599
 1504
 1506
 9943
 8833
 9944
 6678
 5555
 5660
 9911
 6130
 1613

如果我删除“if(found)”语句,一切都运行正常,但如何解决这个问题而不删除它?

提前致谢

---------------编辑---------------

好的,当我将长度改为20时,它似乎仍然无效。我迷路了。

这是我创建数组的地方

inFile >> num;
for (int i=0; i<length && inFile; i++)
{
  search.addToList(num);
  inFile >> num;
}

这是addToList函数

 void Search::addToList(ItemType num)
 {
   if (index < length)  //ive tried taking out this statement just to see if it makes a difference and it didn't
   {
     list[index] = num;
     index++;
   }
 }

我在构造函数

中将index初始化为0

这是我声明数组的方式

    ItemType list[length]; 

IT工作!!!!非常感谢你们!我非常感激。

5 个答案:

答案 0 :(得分:3)

有两种解决方案: 长度应该是20作为值

length = 20;

使用“&lt; =”而不是“&lt;” (在这种情况下,“length”应命名为“lastIndex”)

void Search::sequential(ItemType item, bool& found) 
{  
  int index = 0; 
  while (index <= length && item != list[index]) 
    index++; 
  found = (index <= length);  
} 

答案 1 :(得分:0)

查看您的搜索功能,当您尝试查找第20个数字时,索引会有什么值?

答案 2 :(得分:0)

如果您有20个号码,那么为什么要将长度设置为19?这非常违反直觉。

答案 3 :(得分:0)

Classic Off-By-One问题。请参阅@ Kipotlov的代码更正答案。

答案 4 :(得分:0)

使用C进行指数序列搜索

此代码适用于所有情况,即如果我们要查找数组中的最后一个元素 这段代码可行......

#include<stdio.h>
void main()
{
  int d[100],kin[20],pin[20],temp,k,i,j=0,n,n1=0,start,end;
  printf("Enter the number of elements:");
  scanf("%d",&n);
  for(i=0;i<n;i++)
    scanf("%d",&d[i]);
  printf("Enter the number to be searched:");
  scanf("%d",&k);
  for(i=0;i<n;i+=3)
  {
    kin[n1]=d[i];
    pin[n1]=i;
    n1++;
  }
  if(k < kin[0])
  {
    printf("element not found");
    exit(0);
  }
  else
  {
    for(i=1;i<=n1;i++)
      if(k < kin[i] )
      {
        start=pin[i-1];
        end=pin[i];
        break;
      }
      else
      {
        start=n1;
        end=n-1;
      }
  }
  for(i=start;i<=end;i++)
  {
    if(k==d[i])
    {
      j=1;
      break;
    }
  }
  if(j==1)
    printf("element found at position %d",i);
  else
    printf("element not found");
}