【问题标题】:searching within an array of structs in c在c中的结构数组中搜索
【发布时间】:2013-04-30 22:15:20
【问题描述】:

我看到很多关于如何搜索数组以查找特定实例的示例我想做的是找到所有实例并打印它们,例如我有这个结构

struct BookInfo
{
    char title[50];
    int numAuthors;
    char authors[50][50];
    int year;
    int checkedout;
};

struct BookInfo library[500];

而且我有一个功能可以在几年内搜索,但它只给我它找到的第一个实例我如何让它给我机器人实例??? 这是函数

int yearsearch()
{
int target, i, l, r, mid;
    l = 0;
    r = 14-1;
    printf("type a year to search for book");
    scanf("%d", &target);

    while(l <= r)
    {
        mid = (l+r)/2;
        if(library[mid].year == target)
        {
            printf("\n%s",library[mid].title);
            printf("  %d",library[mid].year);
            printf("These are all the books with that year");
            break;
        }
        else if (library[mid].year < target)
        {
            l = mid + 1;
        }
        else
        {
            r = mid - 1;

        }

        if(l > r)
            printf("The target is not in the array.\n");

    }
menu();

}

【问题讨论】:

  • (响应删除的评论建议删除“中断”)删除中断将导致此循环永远循环而在某些情况下不会终止。这不是正确的解决方案,因为如果“mid”恰好落在给定年份的条目中间,它可能会错过某些元素。
  • 当我这样做时,程序永远不会停止打印它找到的第一个实例,哈哈

标签: c arrays search struct


【解决方案1】:

您正在对数组进行一种二进制搜索,其设计目的不是为了查找所有实例而不进行修改。您是否考虑过仅对数组长度进行线性搜索(即for 循环)并打印数组元素是否符合您的搜索条件?有人可能会像这样实现一个简单的线性搜索:

for (int i = 0; i<500; i++) {
   if (library[i].year == target) {
       // Do your printing here
   }

   // Otherwise do nothing!
}

【讨论】:

  • 不知道二进制搜索如何实现线性搜索(自己查找)
  • 二分查找仅用于确定排序列表中是否存在特定条目。
  • 这不是严格正确的。添加线性探测的二分搜索也可用于确定排序列表中的所有事件。您进行二分搜索,直到找到匹配元素,然后您向后搜索以找到匹配范围的开始,然后向前搜索以找到匹配范围的结束。我只是建议进行线性搜索,因为涉及的元素数量很少,而且更简单。
  • 既然我现在有你的帮助,如果我正在搜索其中一个 char 数组,我可以通过将目标切换为 char 而不是 int 来使用相同的代码
  • 不,索引将保持为“int”,但一般技术将是相同的。在 C 中,数组的索引始终是“int”类型。如果您想发布一些代码,您可以发布一个新问题,我会在那里帮助您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多