/*
问题描述:一个集合满足如下条件:
(1)1是集合的元素;
(2) 若 P 是集合的元素,则 2*P+1,4*P+5 也是集合的元素。
求:此集合中最小的 K 个元素。
*/
- #include<iostream>
- using namespace std;
- struct IntNode{
- int data;
- IntNode* next;
- };
- int main(){
- int P,K,count;
- P=1;
- count=0;
- cout<<"Please Input K!"<<endl;
- cin>>K;
- if(count<K){
- IntNode *SL1,*SL2,*p,*q;
- SL1=new IntNode;
- SL2=new IntNode;
- SL1->data=-1;
- SL1->next=NULL;
- SL2->data=1;
- SL2->next=NULL;//初始化两个有序链,SL2存储待扩展的,SL1存储集合的升序元素
- p=SL1;
- q=SL2;
- while(count<K){
- IntNode *temp=new IntNode;
- temp->data=q->data;
- temp->next=NULL;
- p->next=temp;
- p=temp;//加入1个
- count++;
- /*把2*P+1与4*P+5加入扩展链中*/
- IntNode *temp1= new IntNode;
- temp1->data=(2*(q->data)+1);
- temp1->next=NULL;
- IntNode *temp3=q;
- while(temp3->next!=NULL && temp3->next->data<temp1->data)temp3=temp3->next;
- if(temp3->next==NULL){
- temp3->next=temp1;
- }//加到链末尾
- else{
- temp1->next=temp3->next;
- temp3->next=temp1;
- }//加到链中
- IntNode *temp2= new IntNode;
- temp2->data=(4*(q->data)+5);
- temp2->next=NULL;
- temp3=q;
- while(temp3->next!=NULL && temp3->next->data<temp2->data)temp3=temp3->next;
- if(temp3->next==NULL){
- temp3->next=temp2;
- }//加到链末尾
- else{
- temp2->next=temp3->next;
- temp3->next=temp2;
- }//加到链中
- q=q->next;//后移一位
- }
- cout<<"该集合的前"<<K<<"个元素为"<<endl;
- p=SL1->next;
- while(p!=NULL){
- cout<<p->data<<endl;
- p=p->next;
- }
- /*释放空间*/
- p=SL1;
- while(SL1){
- p=SL1->next;
- delete SL1;
- SL1=p;
- }
- q=SL2;
- while(SL2){
- q=SL2->next;
- delete SL2;
- SL2=q;
- }
- }
- return 0;
- }