注册 登录
编程论坛 数据结构与算法

这段程序是不是没有初始化,关于查找的问题

熊猫的黑眼圈 发布于 2012-12-21 08:45, 478 次点击
#include"stdio.h"
#include"malloc.h"
typedef struct
{
    int t[50];
    int length;
}SSTable;

/*************建立空顺序表*****************/
void Initlist(SSTable l)
{
    //初始化函数
    l.length=0;
}

/************创建顺序表******************/
void Creat(SSTable l)
{
    int i;
    printf("请输入顺序表数据:");
    for(i=0;i<l.length;i++)
        scanf("%d",&(l.t[i]));
    printf("\n");
}

/***************顺序查找法***************/
void Sequential_search(SSTable l,int k)
{
    int i=0;
    l.t[l.length]=k;
    while(l.t[i]!=k)
    {
        printf("第%d个检验的数据是%d\n",i+1,l.t[i]);
        i++;
    }
    if(i==l.length)
    {
        printf("在顺序表中没有查找到您想要的数据\n");
    }
    else
    {
        printf("查找的数据在第%d位上\n",i+1);
    }
}

/**************折半查找算法的实现**************/
void Binary_search(SSTable l,int k)
{
    int low,mid,high;
    low=0;
    high=l.length-1;
    while(low<=high)
    {
        mid=(low+high)/2;
        printf("检测的数据为%d",l.t[mid]);
        if(l.t[mid]=k)
        {
            printf("查找的数据在第%d位上",mid+1);
            break;
        }
        else
            if(l.t[mid]>k)
            {
                high=mid-1;
            }
            else
                low=mid+1;
    }
    if(low>high)
        printf("在顺序表中没有查找到您想要的数据");
}

/**************主函数********************/
void main()
{
    int choose,n=0;
    SSTable l;
    printf("请输入数据个数:");
    scanf("%d",&l.length);
    Initlist(l);
    Creat(l);
    printf("\t\t*******************************\n");
    printf("\t\t     1.顺序查找算法过程\n");
    printf("\t\t     2.折半查找算法过程\n");
    printf("\t\t*******************************\n");
    printf("请选择要进行的查找操作:");
    scanf("%d",&choose);
    if(choose==1)
    {
        printf("请输入要查找的数据:");
        scanf("%d",&n);
        Sequential_search(l,n);
    }
    if(choose==2)
    {
        printf("请输入要查找的数据:");
        scanf("%d",&n);
        Binary_search(l,n);
    }
}
5 回复
#2
熊猫的黑眼圈2012-12-21 09:07
有没有哪位大侠看看,在线等着在
#3
h23637522802012-12-21 12:23
输出的是地址,后面显示的也错了,改一下输出的方式把
#4
crystall2012-12-22 10:30
回复 2楼 熊猫的黑眼圈
出错的原因是:
你在main()函数中的SSTable l 这个变量是栈中局部变量
你所调用的函数传参都是这个局部变量,栈中局部变量有作用域的。

Initlist(l);
Creat(l);
Sequential_search(l,n);
Binary_search(l,n);

而你每个函数的形参是一个新的局部变量,出了作用域,局部变量就被释放了,与main()函数中的SSTable l
毫无瓜葛
void Creat(SSTable l)
{
}
void Initlist(SSTable l)
{
}

如果你还不明白的话,那么你可以调试一下你的程序
如下图:
 请输入数据个数: 比如你输入的数为3,那么 l.length = 3;
 但是你紧接着后面又进行了初始化, Initlist(l), 在进入到初始化函数,初始化之后, l.length = 0;
 但是真正的改变了吗? 没有, main()函数中的l.length 还是等于 3的。

只有本站会员才能查看附件,请 登录



#5
crystall2012-12-22 10:44
回复 4楼 crystall
修改,形参 类型改为SSTable&

/*************建立空顺序表*****************/
void Initlist(SSTable& l)
{
    //初始化函数
    l.length=0;
}

/************创建顺序表******************/
void Creat(SSTable& l)
{
}

/***************顺序查找法***************/
void Sequential_search(SSTable& l,int k)
{
}
/**************折半查找算法的实现**************/
void Binary_search(SSTable& l,int k)
{
}
#6
crystall2012-12-22 10:47
回复 5楼 crystall
也可以改为指针类型,我这里为了尽可能的少改动代码,引用为例。
1