回 帖 发 新 帖 刷新版面

主题:关于对线性表的折半法查找问题


  #include "stdio.h"
  #define AA 20
 int ps=0;/* 定义一个全局变量来记录链表的节点的个数*/
 typedef struct ls
 {int num;
  struct ls *next;
 }ss;

/*下面是建立一个链表,list()*/
  ss *list()
 { ss *h,*r,*s;
  r=s=(ss *)malloc(sizeof(struct ls));
  printf("inter dat :\n");
  scanf("%d",&s->num);
  h=s;
  while(s->num!=0)
 {r->next=s;
 r=s;
 s=(ss *)malloc(sizeof(struct ls));
 scanf("%d",&s->num);
 ps++;
 }
 r->next=NULL;
 return h;
 }
 ss pin(ss *head)/* 建立链表输出函数pin())*/
 {ss *p;
  p=head;
   if(head!=NULL)
    do
    {printf("%2d\n",p->num);
     p=p->next;
    }while(p!=NULL);
  }
 int zheban(ss s[],int n,int x)/*注意这个s[]为要寻找的线性表,而这个n为这个线性表的长度,而这个为要寻找的线性表的元素*/
{ /*前提是,线性表的元素已经按照某种顺序排列好了*/
 int low=0,hig=n-1,found=0;/*low执行线性表的下表0,而hig执行链表的最大下表*/
 int mid;  /*min为这个中间值,即折半值*/
 while((low<=hig)&&(!found))/*found为一个标记变量*/
  { mid=(low+hig)/2;
  if(x==s[mid].num)
   found=1;
  else
  if(x>s[mid].num)
   low=mid+1;
   else
   hig=mid-1;
  }
  if(found)
  {return (mid);}
  else
  {return (-1); }
  }
main()
{ss *p;int w;
 int x;
 p=list();
 pin(p);
 printf("kai shi chazhao shu ju:\n");
 scanf("%d",&x);
 w=zheban(p,ps,x);
 printf("the shu zhi is %d",w);
 getch();
}
这个是我写的一个对有序(我输入数值是有序)的进行折半法的查找程序,使用折半法查找,但是,每次都是返回-1,也就是说找不到,,到底是什么回事?ps为我定义的一个全局变量,来记录输入的链表的元素数,请各位帮忙,,,
[/code]

回复列表 (共2个回复)

沙发

查错之前习惯性地唠叨一句,变量名用得太乱了……

板凳

问题很明显,lz自己没有注意到:
你定义的是个链表,但是套用的是顺序表的折半查找函数。链表哪来的下标可用呢?内存都是分别申请的,不会都按你申请的顺序连在一起

我来回复

您尚未登录,请登录后再回复。点此登录或注册