集合中找K小元素

/*

问题描述:一个集合满足如下条件:
   (1)1是集合的元素;
   (2) 若 P 是集合的元素,则 2*P+1,4*P+5 也是集合的元素。
 求:此集合中最小的 K 个元素。

*/ 


  1. #include<iostream>
  2. using namespace std;
  3. struct IntNode{
  4.  int data;
  5.  IntNode* next;
  6. };
  7. int main(){
  8.  int P,K,count;
  9.  P=1;
  10.     count=0;
  11.  cout<<"Please Input K!"<<endl;
  12.  cin>>K;
  13.  if(count<K){
  14.   IntNode *SL1,*SL2,*p,*q;
  15.   SL1=new IntNode;
  16.   SL2=new IntNode;
  17.   SL1->data=-1;
  18.   SL1->next=NULL;
  19.   SL2->data=1;
  20.   SL2->next=NULL;//初始化两个有序链,SL2存储待扩展的,SL1存储集合的升序元素
  21.   p=SL1;
  22.   q=SL2;
  23.   while(count<K){
  24.    IntNode *temp=new IntNode;
  25.    temp->data=q->data;
  26.    temp->next=NULL;
  27.    p->next=temp;
  28.    p=temp;//加入1个
  29.    count++;
  30.    /*把2*P+1与4*P+5加入扩展链中*/
  31.    IntNode *temp1= new IntNode;
  32.    temp1->data=(2*(q->data)+1);
  33.    temp1->next=NULL;
  34.    IntNode *temp3=q;
  35.    while(temp3->next!=NULL && temp3->next->data<temp1->data)temp3=temp3->next;
  36.    if(temp3->next==NULL){
  37.     temp3->next=temp1;
  38.    }//加到链末尾
  39.    else{
  40.                 temp1->next=temp3->next;
  41.     temp3->next=temp1;
  42.    }//加到链中
  43.         
  44.    IntNode *temp2= new IntNode;
  45.    temp2->data=(4*(q->data)+5);
  46.    temp2->next=NULL;
  47.    temp3=q;
  48.    while(temp3->next!=NULL && temp3->next->data<temp2->data)temp3=temp3->next;
  49.    if(temp3->next==NULL){
  50.     temp3->next=temp2;
  51.    }//加到链末尾
  52.    else{
  53.                 temp2->next=temp3->next;
  54.     temp3->next=temp2;
  55.    }//加到链中
  56.             q=q->next;//后移一位
  57.   }
  58.   cout<<"该集合的前"<<K<<"个元素为"<<endl;
  59.   p=SL1->next;
  60.   while(p!=NULL){
  61.    cout<<p->data<<endl;
  62.    p=p->next;
  63.   }
  64.   /*释放空间*/
  65.   p=SL1;
  66.   while(SL1){
  67.      p=SL1->next;
  68.            delete SL1;
  69.      SL1=p;
  70.   }
  71.   q=SL2;
  72.   while(SL2){
  73.      q=SL2->next;
  74.            delete SL2;
  75.      SL2=q;
  76.   }
  77.  }
  78.  return 0;
  79. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值