| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 696 人关注过本帖
标题:求助,一递归调用二分查找,出现了死循环了。(求不水)!
只看楼主 加入收藏
夕痕
Rank: 1
来 自:临界
等 级:新手上路
帖 子:40
专家分:3
注 册:2013-4-22
结帖率:90%
收藏
已结贴  问题点数:14 回复次数:3 
求助,一递归调用二分查找,出现了死循环了。(求不水)!
程序代码:
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;

#define size 1000
#define error -1
#define ok 0
#define Status int
int m,n;                //m用来记录第一次从文本中读取出来的数据,且存放在数组的长度

typedef char ElemType;
typedef struct Sqlist
{
    char *data;
    int length;
} Sqlist;
Status InitList(Sqlist &l)          //初始化一个顺序表
{
    l.data = (char *)malloc(size*sizeof(char));
    l.length = 0;
    cout<<"\n";
    return ok;
}
Status Input(Sqlist &l)             //读取文档的内容,并存入表中
{
    FILE *f;
    int i = 0;
    char ch;
    char *filename = "E://123.txt";
    f = fopen(filename,"r");
    if(f == NULL)
    {
        cout<<"\t\t文件读取失败!\n";
        return error;
    }
    else
    {
        while(!feof(f))             //数据的读入把数据存入数组中
        {
            ch = fgetc(f);
            l.data[i] = ch;
            i ++ ;
            if(i >= size)
            {
                cout<<"\t\t内存不足!\n"<<endl;
                break;
            }
        }
        m = i - 1;
        cout<<"\n";
        fclose(f);
    }
    return ok;
}
Status Output(Sqlist &l)            //读出数据
{
    Input(l);
    cout<<"\t内容为 : "<<"\n"<<endl;
    cout<<"\t";
    for(int i = 0; i < m; i++)
        cout<<l.data[i];
    cout<<"\n\n";
    cout<<"\t整理后的排序为:\n\n";
    sort(l.data,l.data+m);
    cout<<"\t";
    for(int i = 0 ; i < m; i++)
        cout<<l.data[i]<<" ";
    cout<<"\n\n";
    return ok;
}

Status Search_Bin(Sqlist &l,char bh,int low,int higth,int count)      //递归调用二分
{
//    double asl;               //count为记录bh出现的次数
    int mid = (low+higth)/2;
    cout<<"\t"<<mid;
    int fale = 1;
    while(fale)
    {
        if(low>higth&&higth<0)
            fale = 0;
        if(bh == l.data[mid])
            count++;
        cout<<l.data[mid]<<endl;
        if((bh < l.data[mid])&&(low >= 0)&&(higth >= low))          //关键字比中间小的时候,调用前部分
        {
            higth = mid - 1;
            Search_Bin(l,bh,low,higth,count);
        }
        else if((bh > l.data[mid])&&(low >= 0)&&(low <= higth))        //大的时候,调用后半部分
        {
            low = mid + 1;
            Search_Bin(l,bh,low,higth,count);
        }
    }
    n = count;
    return ok;
}
int main()
{
    int k = 1;
    int i;
    Sqlist l;
    ElemType ch;
    int low;
    int higth,count = 0;
    cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n";
    cout<<"$$$$$$$$$$$$$$$                $$$$$$$$$$$$$$$\n";
    cout<<"$$$$$$$$$$                          $$$$$$$$$$\n";
    cout<<"$$$$$$           请输入操作             $$$$$$\n";
    cout<<"$$$$           (0)建立顺序表              $$$$\n";
    cout<<"$$             (1)读取程序代码              $$\n";
    cout<<"$$             (2)显示代码                  $$\n";
    cout<<"$$$$           (3)查找的关键字            $$$$\n";
    cout<<"$$$$$$         (4)退出                  $$$$$$\n";
    cout<<"$$$$$$$$$$                          $$$$$$$$$$\n";
    cout<<"$$$$$$$$$$$$$$$                $$$$$$$$$$$$$$$\n";
    cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n";
    cout<<""<<endl;
    while(k)
    {
        cout<<"\t请输入指令 :";
        cin>>i;
        if(i == 4)
            break;
        switch(i)
        {
        case 0:
            InitList(l);
            cout<<"\t表已经建立成功!\n"<<endl;
            break;
        case 1:
            Input(l);
            cout<<"\t程序已经读取!\n"<<endl;
            break;
        case 2:
            Output(l);
            cout<<"\t程序已经读取完毕!\n"<<endl;
            cout<<"\t长度为:"<<m<<endl;
            cout<<"\n";
            break;
        case 3:
            low = 0;
            higth = m - 1;
            cout<<"\n";
            cout<<"\t请输入要查找的数 : ";
            cin>>ch;
            cout<<"\n";
            Search_Bin(l,ch,low,higth,count);
            cout<<"\t"<<ch<<" 共出现 "<<n<<" 次 !\n"<<endl;
            break;
        default:
            cout<<"\t指令错误!"<<endl;
            continue;
        }
    }
    exit(ok);
}
2013-12-20 11:43
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:5 
调试~~

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-12-20 17:15
菜鸟学习篇
Rank: 2
等 级:论坛游民
帖 子:8
专家分:39
注 册:2013-12-18
收藏
得分:5 
fale 这个变量应该是全局变量才对,而且 递归套用WHILE 很少见。
2013-12-20 18:46
sara_org
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-2-25
收藏
得分:0 
一看就死循环了!判断条件应该是if (low <= high) {...}
2014-02-25 14:21
快速回复:求助,一递归调用二分查找,出现了死循环了。(求不水)!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023650 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved