アットウィキロゴ

lab9

こいつはvisual studioでは動きません。テラタームで実行おねがいします。
提出はこれでも良いけど、もっと良い答えがあるようです。下にもう一つ作ってあります。

  • 一つ目の解答
    #include<stdio.h>
    #include<stdlib.h>
     
     #define N 100000
     
     int deletemax(int *A,int *n);//ヒープ内の一番小さい数をけす
     void downmax(int i,int *A,int n);//木をヒープの順に並び変える
     void swap(int i,int j,int *A);//配列A[i]とA[j]を入れ替える
     void insert(int x,int *A,int *n);//木に新しい要素を入れる
     void upmin(int i,int *A,int n);//ヒープの数を比較し、親の方が大きかったとき入れ替える 
     
     int main(int argc,char *argv[])
     {
     	FILE *fp;
      	fp = fopen("rand1000.dat","r");//テキストを開く
     	int A[N];
     	int a,b,n=0,i,m,temp,j,k=0;
     	int seiretu[N];
     	fscanf(fp,"%d",&a);//要素の数を決める
     	for(i=0;i<a;i++){//要素の数だけまわす
     		fscanf(fp,"%d",&b);//新しい要素に入れる数
     		insert(b,A,&n);//新しい要素を作る
      	}
         	//========木構造の表示=========================================
      	temp=1;
     		for(j=1;j<=n;j++){
     			if(temp==j){
     				if(j!=1) printf("\n");
     			temp*=2;
     			}
     			printf(" %d",A[j-1]);
    		}
    		//=============================================================
    	while(n>0){
    	seiretu[k]=deletemax(A,&n);//最大値を配列へ代入
    	k++;
     	}
    	printf("\nwood end\n\n\n\n");
    	for(i=0;i<a;i++) printf("%d ",seiretu[i]);//整列された数字を表示する
    	fclose(fp);
     }
    
    //ヒープ内の一番大きい数をけす
    	int deletemax(int *A,int *n)
    	{
    		int min,n1;
    		n1= *n;
    		if(n1<1){//要素の数が0より小さいとき
    			printf("\n%d\n",n1);
    			printf("Error: Heap is empty.\n");
    			return -1;
    		}
    		min=A[0];A[0]=A[n1-1];//最大値を消す
    		if(n1>1) downmax(0,A,n1-1);
    		*n=n1-1;//全体の要素数をへらす
    		return min;
    	}
    
    //木をヒープの順に並び変える
    	void downmax(int i,int *A,int n)
    	{
    		int j;
    		if(i<0 || i>=n)
    		{
    			printf("Illegal element i=%d for n=%d\n",i,n);exit(1);
    		}
    		j=2*i+1;
    		if(j>=n) return;
     		if(j+1<n && A[j]<A[j+1]) j=j+1;
    
    		if(A[j]>A[i])
    		{
    			swap(i,j,A);//入れ替え
    			downmax(j,A,n);//並び替え
    		}
     		return ;
     	}
     
     	void swap(int i,int j,int *A)
     	{
     		int temp;
     		temp=A[i];A[i]=A[j];A[j]=temp;
     		return;
     	}
    //木に新しい要素を入れる
     void insert(int x,int *A,int *n)
    { 
    	int n1;
    	n1=*n;
    	if(n1>=N)
    	{
    		printf("Error: Heap A is full.\n");
    		exit(1);
    	}
    	A[n1]=x;
    	upmin(n1,A,n1+1);
    	*n=n1+1;
    	return;
    }   
     
                //ヒープの数を比較し、親の方が小さかったとき入れ替える
    void upmin(int i,int *A,int n)
    { 
    	int j;
    	if(i<0 || i>=n)
    	{
    		printf("Illegal element i=%d for n=%d\n",i,n);exit(1);
    	}
    	if(i==0) return;
    	j=(i-1)/2;
    	if(A[j]<A[i])
    	{
    		swap(i,j,A);//入れ替え
    		upmin(j,A,n);//並び替え
    	}
    	return;
     }  
    
     //数字の数が増えすぎると木構造が見にくくなる
    
  • より良い解答(推奨)
    #include<stdio.h>
    #include<stdlib.h>
    
    #define N 100000
    
    int deletemin(int *A,int *n);//ヒープ内の一番小さい数をけす
    void downmin(int i,int *A,int n);//木をヒープの順に並び変える
    void swap(int i,int j,int *A);//配列A[i]とA[j]を入れ替える
    void insert(int x,int *A,int *n);//木に新しい要素を入れる
    void upmin(int i,int *A,int n);//ヒープの数を比較し、親の方が大きかったとき入れ替える
    
    int main(int argc,char *argv[])
    {
    	FILE *fp;
     	fp = fopen("rand1000.dat","r");//テキストを開く
    	int A[N];
    	int a,b,n=0,i,m,temp,j,k;
    	fscanf(fp,"%d",&a);//要素の数を決める
    	for(i=0;i<a;i++){//要素の数だけまわす
    		fscanf(fp,"%d",&b);//新しい要素に入れる数
     		insert(b,A,&n);//新しい要素を作る
    	}
    	//========木構造の表示=========================================
    	temp=1;
    		for(j=1;j<=n;j++){
    			if(temp==j){
    				if(j!=1) printf("\n");
    			temp*=2;
    			}
    			printf(" %d",A[j-1]);
    		}
    		//=============================================================
    		k=n-1;
    	while(n>0){
    	A[k]=deletemin(A,&n);//最大値を配列へ代入
    	k--;
     	}
    	printf("\nwood end\n\n\n\n");
    	for(i=0;i<a;i++) printf("%d ",A[i]);//整列された数字を表示する
    	fclose(fp);
    } 
    
    //ヒープ内の一番大きい数をけす
    	int deletemin(int *A,int *n)
    	{
    		int min,n1;
    		n1= *n;
    		if(n1<1){//要素の数が0より小さいとき
    			printf("\n%d\n",n1);
    			printf("Error: Heap is empty.\n");
    			return -1;
    		}
    		min=A[0];A[0]=A[n1-1];//最大値を消す
    		if(n1>1) downmin(0,A,n1-1);
    		*n=n1-1;//全体の要素数をへらす
    		return min;
    	}
    
    //木をヒープの順に並び変える
    	void downmin(int i,int *A,int n)
    	{
    		int j;
    		if(i<0 || i>=n)
    		{
    			printf("Illegal element i=%d for n=%d\n",i,n);exit(1);
    		}
    		j=2*i+1;
    		if(j>=n) return;
      		if(j+1<n && A[j]<A[j+1]) j=j+1;
    
    		if(A[j]>A[i])
    		{
    			swap(i,j,A);//入れ替え
    			downmin(j,A,n);//並び替え
    		}
    		return ;
    	}
    
    	void swap(int i,int j,int *A)
    	{
    		int temp;
    		temp=A[i];A[i]=A[j];A[j]=temp;
    		return;
    	}
    //木に新しい要素を入れる
    void insert(int x,int *A,int *n)
    { 
    	int n1;
    	n1=*n;
    	if(n1>=N)
    	{
    		printf("Error: Heap A is full.\n");
    		exit(1);
    	}
    	A[n1]=x;
    	upmin(n1,A,n1+1);
    	*n=n1+1;
    	return;
    }   
     
    //ヒープの数を比較し、親の方が小さかったとき入れ替える
    void upmin(int i,int *A,int n)
    { 
    	int j;
    	if(i<0 || i>=n)
    	{
    		printf("Illegal element i=%d for n=%d\n",i,n);exit(1);
    	}
    	if(i==0) return;
    	j=(i-1)/2;
    	if(A[j]<A[i])
    	{
    		swap(i,j,A);//入れ替え
    		upmin(j,A,n);//並び替え
    	}
    	return;
    }  
    

タグ:

+ タグ編集
  • タグ:
最終更新:2007年06月25日 22:15
添付ファイル