严蔚敏数据结构习题集10.42 序列的“中值记录”指的是:如果将此序列排序后,它是第┌n/2┐个记录。试写一个求中值记录的算法

头文件base.h中存储结构的定义,和严书中一致

#ifndef BASE_H
#define BASE_H
#define MAXSIZE 100
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
#define GT(a,b) ((a)>(b))
typedef struct
{
  KeyType key; //关键字
  InfoType otherinfo; //其他数据
}RedType; //记录类型
typedef struct
{
  RedType r[MAXSIZE-1]; //r[0] 用作哨兵
  int length; //顺序表长度
}SqList;

void Input(RedType &c) //输入数据
{
  scanf("%d%d",&c.key,&c.otherinfo);
}
#endif

主文件test.cpp中的内容,这里定义了一个新的结构SLNode,函数zhongzhi为求中值记录的算法

#include<iostream>
#include<cstdio>
#include<cmath>
typedef int KeyType;
typedef int InfoType;
#include"base.h"
using namespace std;
typedef struct
{
  int low;
  int high;
}SLNode;
RedType zhongzhi(SqList L)
{
  if(L.length==0) exit(0);
  if(L.length==1) return L.r[1];
  int i,j,k;
  SLNode sign[L.length+1];
  for(i=1;i<=L.length;i++)
  {
    sign[i].low=0;
    sign[i].high=0;
  }
  for(i=1;i<=L.length-1;i++)
   for(j=i+1;j<=L.length;j++)
   {
     if(GT(L.r[i].key,L.r[j].key)) //>
     {
       sign[i].high++;
       sign[j].low++;
     }
     if(LQ(L.r[i].key,L.r[j].key)) //<=
     {
       sign[i].low++;
       sign[j].high++;
     }
   }
  for(i=1;i<=L.length;i++)
  {
    k=abs(sign[i].high-sign[i].low);
    if(k==0||k==1)
     return L.r[i];
  }
}
int main()
{
  SqList m;
  int i;
  scanf("%d", &m.length);
  for(i=1; i<=m.length; i++)
    Input(m.r[i]);
  RedType ans;
  ans=zhongzhi(m);
  cout<<"\n中值为:"<<"(key:"<<ans.key<<" info:"<<ans.otherinfo<<")"<<endl;
  return 0;
}
/* 测试数据
10
1 1
2 2
1 3
2 4
2 5
1 6
3 7
3 8
3 9
4 10
*/

如果这个有错误大家一定要提出来呀,这个习题集我做的也是很自闭啊!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值