⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ulti.c

📁 用哈夫曼编码实现文件压缩和解压缩. 压缩过程的实现:1创建Haffman树&#61664 2打开需压缩文件&#61664 3将需压缩文件中的每个ascii码对应的haffman编码按bit单位输出&
💻 C
字号:
#include "Global.h"
#include "MyAssert.h"
#include "Ulti.h"
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
void swap(Type* a,Type* b)
{
	Type tmpV;
	assertF(a!=NULL,"in swap,a is NULL");
	assertF(b!=NULL,"in swap,b is NULL");
	
	tmpV=*a;
	*a=*b;
	*b=tmpV;
}

/*swap array data*/
void swapArrData(Type* arr,int pos1,int pos2)
{
	Type tmpData;
	assertF(arr!=NULL,"In swapArrData,arr is NULL\n");
	tmpData=arr[pos1];
	arr[pos1]=arr[pos2];
	arr[pos2]=tmpData;
}

void outputListArrFloat(Type* arr,long startPos,long len,FILE* outputFile)
{
	long i=0;/*iterator num*/
	assertF(len-startPos>0,"in outputListArrFloat len-startPos<=0\n");
	assertF(arr!=NULL,"In outputListArrFloat,arr is NULL\n");
	assertF(outputFile!=NULL,"in outputListArrFloat ,outputFile is NULL\n");
	for(i=startPos;i<len;i++)	
	{
		fprintf(outputFile,"%10.5f ",arr[i]);
		if((i+1)%10==0)
			fprintf(outputFile,"\r\n");
	}
	fprintf(outputFile,"\r\n");
}

extern void outputListArrInt(Type* arr,long startPos,long len,FILE* outputFile)
{
	long i=0;/*iterator num*/
	assertF(len-startPos>0,"in outputListArrFloat len-startPos<=0\n");
	assertF(arr!=NULL,"In outputListArrFloat,arr is NULL\n");
	assertF(outputFile!=NULL,"in outputListArrFloat ,outputFile is NULL\n");
	for(i=startPos;i<len;i++)	
	{
		fprintf(outputFile,"%d,",arr[i]);
		if((i+1)%10==0)
			fprintf(outputFile,"\r\n");
	}
	fprintf(outputFile,"\r\n");
}
extern void outputListArrInt2(int* arr,int startPos,int len,char* outputFileName)
{
	FILE* outputFile;/*the outputFile for the data output*/
	int i;/*iterator number*/
	/*assertion*/
	assertF(len-startPos>0,"in outputListArrFloat2 len-startPos<=0\n");
	assertF(arr!=NULL,"In outputListArrFloa2t,arr is NULL\n");
	assertF(outputFileName!=NULL,"in outputListArrFloat2,listFileName is null\n");
	/*open file*/
	assertF((outputFile=fopen(outputFileName,"wb"))!=NULL,"output file open error\n");
	for(i=startPos;i<len;i++)	
	{
		fprintf(outputFile,"%10d",arr[i]);
		if((i+1)%10==0)
			fprintf(outputFile,"\r\n");
	}
	fprintf(outputFile,"\r\n");
	fclose(outputFile);
}

void outputListArrFloat2(Type* arr,int startPos,int len,char* outputFileName)
{
	FILE* outputFile;/*the outputFile for the data output*/
	int i;/*iterator number*/
	/*assertion*/
	assertF(len-startPos>0,"in outputListArrFloat2 len-startPos<=0\n");
	assertF(arr!=NULL,"In outputListArrFloa2t,arr is NULL\n");
	assertF(outputFileName!=NULL,"in outputListArrFloat2,listFileName is null\n");
	/*open file*/
	assertF((outputFile=fopen(outputFileName,"wb"))!=NULL,"output file open error\n");
	for(i=startPos;i<len;i++)	
	{
		fprintf(outputFile,"%10.5f ",arr[i]);
		if((i+1)%10==0)
			fprintf(outputFile,"\r\n");
	}
	fprintf(outputFile,"\r\n");
	fclose(outputFile);
}

void outputListArrIntToMatlab(int* arr,int startPos,int len,char* outputFileName)
{
	FILE* outputFile;/*the outputFile for the data output*/
	int i;/*iterator number*/
	/*assertion*/
	assertF(len-startPos>0,"in outputListArrFloat2 len-startPos<=0\n");
	assertF(arr!=NULL,"In outputListArrFloa2t,arr is NULL\n");
	assertF(outputFileName!=NULL,"in outputListArrFloat2,listFileName is null\n");
	/*open file*/
	assertF((outputFile=fopen(outputFileName,"wb"))!=NULL,"output file open error\n");
	fprintf(outputFile,"arr=[");
	for(i=startPos;i<len;i++)
		fprintf(outputFile,"%d ",arr[i]);
	fprintf(outputFile,"]\r\n");
	
	fclose(outputFile);	
	
	
	
}
void outputListArrFloatToMatlab(Type* arr,int startPos,int len,char* outputFileName)
{
	FILE* outputFile;/*the outputFile for the data output*/
	int i;/*iterator number*/
	/*assertion*/
	assertF(len-startPos>0,"in outputListArrFloat2 len-startPos<=0\n");
	assertF(arr!=NULL,"In outputListArrFloa2t,arr is NULL\n");
	assertF(outputFileName!=NULL,"in outputListArrFloat2,listFileName is null\n");
	/*open file*/
	assertF((outputFile=fopen(outputFileName,"wb"))!=NULL,"output file open error\n");
	fprintf(outputFile,"arr=[");
	for(i=startPos;i<len;i++)
		fprintf(outputFile,"%f ",arr[i]);
	fprintf(outputFile,"]\r\n");
	
	fclose(outputFile);	
}

void output2DArrInt(Type** arr,int col,int row,FILE* outputFile)
{
	int i=0,j=0;/*iterator value*/
	assertF(arr!=NULL,"In output2DArr,arr is NULL\n");
	assertF(outputFile!=NULL,"in output2DArr, outputFile is NULL");
	for(i=0;i<col;i++)
		{
			for(j=0;j<row-1;j++)
				{
					fprintf(outputFile,"%d,",arr[i][j]);
				}
			fprintf(outputFile,"%d;\r\n",arr[i][j]);	
		}
}

void output2DArrFloat(Type** arr,int col,int row,FILE* outputFile)
{
	int i=0,j=0;/*iterator value*/
	assertF(arr!=NULL,"In output2DArr,arr is NULL\n");
	assertF(outputFile!=NULL,"in output2DArr, outputFile is NULL");
	for(i=0;i<col;i++)
		{
			for(j=0;j<row-1;j++)
				{
					fprintf(outputFile,"%f,",arr[i][j]);
				}
			fprintf(outputFile,"%f;\r\n",arr[i][j]);	
		}	
}
void show2DArrInt(Type** arr,int col,int row)
{
	int i=0,j=0;/*iterator value*/
	int pos=0;/*output control*/
	assertF(arr!=NULL,"In showArr,arr is NULL\n");
	for(i=0;i<col;i++)
		{
			for(j=0;j<row-1;j++)
				{
					printf("%d,",arr[i][j]);
					pos++;
					if(pos>10)
					{
						printf("\n");
						pos=0;
					}
				}
			printf("%d;\n",arr[i][j]);
			pos=0;	
		}
	printf("\n");
}

void show2DArrFloat(Type** arr,int col,int row)
{
	int i=0,j=0;/*iterator value*/
	int pos=0;/*output control*/
	assertF(arr!=NULL,"In showArr,arr is NULL\n");
	for(i=0;i<col;i++)
		{
			for(j=0;j<row-1;j++)
				{
					printf("%f,",arr[i][j]);
					pos++;
					if(pos>10)
					{
						printf("\n");
						pos=0;
					}
				}
			printf("%f;\n",arr[i][j]);
			pos=0;	
		}
	printf("\n");
}
void showArrListInt(Type* arr,int startPos,int len)
{
	int i=0;/*iterator num*/
	assertF(len-startPos>0,"in sumArr len-startPos<=0\n");
	assertF(arr!=NULL,"In showArrListFloat,arr is NULL\n");
	for(i=startPos;i<len-1;i++)	
		printf("%d,",arr[i]);
	printf("%d;\n",arr[i]);
}

void showArrListFloat(Type* arr,int startPos,int len)
{
	int i=0;/*iterator num*/
	assertF(len-startPos>0,"in sumArr len-startPos<=0\n");
	assertF(arr!=NULL,"In showArrListFloat,arr is NULL\n");
	for(i=startPos;i<len-1;i++)	
		printf("%f,",arr[i]);
	printf("%f;\n",arr[i]);
}

Type sumArr(Type* inArr,int len)
{
	int i=0;/*iterator num*/
	Type ans=0;
	assertF(inArr!=NULL,"in sumArr,inArr is NULL\n");
	for(i=0;i<len;i++)
		ans+=inArr[i];
	return ans;
}

void arrEachBy(Type* firstArr,Type* secondArr,Type** ansArr,int len)
{
	int i=0;/*iterator num*/
	/*assertion*/
	assertF(firstArr!=NULL,"in arrEachBy,firstArr is NULL\n");
	assertF(secondArr!=NULL,"in arrEachBy,secondArr is NULL\n");	
	assertF(ansArr!=NULL,"in arrEachBy,ansArr is NULL\n");
	
	for(i=0;i<len;i++)
		(*ansArr)[i]=firstArr[i]*secondArr[i];
}

void reverseArr(Type** arr,int len)
{
	int i=0,j=0;/*iterator num*/
	Type* tmpArr;/*tmp arr*/
	
	assertF(*arr!=NULL,"in reverseArr,arr is NULL\n");
	/*memory apply*/
	tmpArr=(Type*)malloc(len*sizeof(Type));
	assertF(tmpArr!=NULL,"in reverseArr,tmpArr is NULL\n");
	
	for(i=0;i<len;i++)
		tmpArr[i]=(*arr)[i];
	
	/*rever operator*/
	j=len;
	for(i=0;i<len;i++)
	{	j--;
		(*arr)[i]=tmpArr[j];
	}
		
	free(tmpArr);
}

void twoDArrMemApply(Type*** inArr,int rowNum,int colNum)
{
	int i=0;/*iterator vaule*/
	(*inArr)=(Type**)malloc(sizeof(Type*)*rowNum);
	for(i=0;i<rowNum;i++)
		(*inArr)[i]=(Type*)malloc(sizeof(Type)*colNum);
	assertF(*inArr!=NULL,"in twoDArrMemApply,inArr at last is null\n");
}

void twoDArrMemFree(Type*** inArr,int rowNum)
{
	int i=0;/*iterator value*/
	assertF((*inArr)!=NULL,"in 2d arr mem free,in arr is null\n");
	
	for(i=0;i<rowNum;i++)
		free((*inArr)[i]);
	
	free((*inArr));
}

void listArrMemApply(Type** inArr,int len)
{
	int i=0;/*iterator vaule*/
	(*inArr)=(Type*)malloc(sizeof(Type)*len);
	
	assertF(*inArr!=NULL,"in listArrMemApply,inArr at last is null\n");
}

void readListFloat(Type** listArr,int* len,char* listFileName)
{
	int i=0;/*iterator value*/
	FILE* inputFile;/*input file pointer*/
	/*list file specification:
	listLen;
	data1,data2,data3;
	*/
	assertF(len!=NULL,"in readList,pointer len is null\n");
	assertF(listFileName!=NULL,"in readList,listFileName is null\n");
	/*open file*/
	assertF((inputFile=fopen(listFileName,"rb"))!=NULL,"input file error");
	/*read in list len*/
	fscanf(inputFile,"%d;",len);
	printf("len in %s is:%d\n",listFileName,*len);
	/*mem apply*/
	*listArr=(Type*)malloc(sizeof(Type)*(*len));
	assertF((*listArr)!=NULL,"in readList ,listArr apply failure\n");
	/*read in data*/
	for(i=0;i<*len-1;i++)
		fscanf(inputFile,"%f,",&(*listArr)[i]);
	fscanf(inputFile,"%f;",&(*listArr)[i]);
	/*show infomation*/
	showArrListFloat(*listArr,0,*len);
	
	fclose(inputFile);
}

void read2DArrFloat(Type*** twoDArr,int* rowNum,int* colNum,char* inputFileName)
{
	int i=0,j=0;/*iterator values*/
	FILE* inputFile;/*input file name*/
	/*2d arr file specification:
	rowNum,colNum;
	a11,a12,a13;
	...
	a31,a32,a33;
	*/
	assertF(rowNum!=NULL&&colNum!=NULL,"in readList,pointer len is null\n");
	assertF(inputFileName!=NULL,"in readList,listFileName is null\n");
	/*open file*/
	assertF((inputFile=fopen(inputFileName,"rb"))!=NULL,"input file error");
	/*read in colNum and rowNum*/
	fscanf(inputFile,"%d,%d;",rowNum,colNum);
	printf("RowNum and colNum in %s is:(%d,%d)\n",inputFileName,*rowNum,*colNum);
	/*mem apply*/
	twoDArrMemApply(twoDArr,*rowNum,*colNum);
	/*Read in data*/
	for(i=0;i<*rowNum;i++)
	{
		for(j=0;j<*colNum-1;j++)/*attention ,have to minus 1 here*/
			fscanf(inputFile,"%f,",&((*twoDArr)[i][j]));
		fscanf(inputFile,"%f;",&((*twoDArr)[i][j]));
	}
	/*show infomation*/
	show2DArrFloat((*twoDArr),*rowNum,*colNum);
	fclose(inputFile);
}

/*list ulti operation*/
Type maxValInList(Type* inList,int len)
{
	int i;/*iterator num*/
	Type maxData;
	assertF(inList!=NULL,"in maxValInList,inList is NULL\n");
	maxData=inList[0];
	for(i=1;i<len;i++)
		if(inList[i]>maxData)maxData=inList[i];
	return maxData;
}

Type maxAbsValInList(Type* inList,int len)
{
	int i;/*iterator num*/
	Type maxData;
	assertF(inList!=NULL,"in maxValInList,inList is NULL\n");
	maxData=(Type)fabs(inList[0]);
	for(i=1;i<len;i++)
		if(fabs(inList[i])>maxData)maxData=(Type)fabs(inList[i]);
	return maxData;
}

int listNotZero(Type* inList,int len)
{
	int i=0;/*iterator*/
	int flag;
	float e=(float)0.00001;/*the precise controller*/
	Type sum=0;
	
	assertF(inList!=NULL,"in list not zero,in list is null\n");
	
	sum=0;
	for(i=0;i<len;i++)
		sum+=inList[i];
	
	if(fabs(sum)<=e)flag=0;
	else flag=1;
	
	return flag;
}

/*matrix ulti operation*/
void matrixCopy(Type** sourceMatrix,Type** targetMatrix,int rowNum,int colNum)
{
	int i,j;/*iterator num*/
	assertF(sourceMatrix!=NULL,"in matrixCopy,sourceMatrix is null\n");
	assertF(targetMatrix!=NULL,"in matrixCopy,targetMatrix is null\n");
	for(i=0;i<rowNum;i++)
		for(j=0;j<colNum;j++)
			targetMatrix[i][j]=sourceMatrix[i][j];		
}

Type sumSomeRow(Type** inMatrix,int rowIndex,int colStart,int colEnd)
{
	Type sum;
	int j;
	
	assertF(inMatrix!=NULL,"in sumSomeRow,inMatrix is null\n");
	
	sum=0;
	for(j=colStart;j<=colEnd;j++)
		sum+=inMatrix[rowIndex][j];
	
	return sum;
}

Type sumSomeRowPower(Type** inMatrix,int rowIndex,int colStart,int colEnd,int powNum)
{
	Type sum;
	int j;
	
	assertF(inMatrix!=NULL,"in sumSomeRowPower,inMatrix is null\n");
	
	sum=0;
	for(j=colStart;j<=colEnd;j++)
		sum+=(Type)pow(inMatrix[rowIndex][j],powNum);
	
	return sum;
}


Type sumTwoRowBy(Type** inMatrix,int rowIndex1,int rowIndex2,int colStart,int colEnd)
{
	Type sum;
	int j;
	
	assertF(inMatrix!=NULL,"in sumSomeRowBy,inMatrix is null\n");
	
	sum=0;
	for(j=colStart;j<=colEnd;j++)
		sum+=inMatrix[rowIndex1][j]*inMatrix[rowIndex2][j];
	
	return sum;
}

Type sumArr_JKByList_K(Type** inMatrix,Type* inList,int rowIndex,int colStart,int colEnd)
{
	Type sum;
	int j;
	
	assertF(inMatrix!=NULL,"in sumSomeRow,inMatrix is null\n");
	assertF(inList!=NULL,"in sumSomeRow,inList is null\n");
	
	sum=0;
	
	for(j=colStart;j<=colEnd;j++)
		sum+=inMatrix[rowIndex][j]*inList[j];
	
	return sum;
}

Type sumArr_KJByList_K(Type** inMatrix,Type* inList,int colIndex,int rowStart,int rowEnd)
{
	Type sum;
	int i;
	
	assertF(inMatrix!=NULL,"in sumSomeRow,inMatrix is null\n");
	assertF(inList!=NULL,"in sumSomeRow,inList is null\n");
	
	sum=0;
	
	for(i=rowStart;i<=rowEnd;i++)
		sum+=inMatrix[i][colIndex]*inList[i];
	
	return sum;
	
	
}

Type sumArr1_IKByArr2_JK(Type** inMatrix1,Type** inMatrix2,int rowIndex1,int rowIndex2,int colStart,int colEnd)
{
	Type sum;
	int j;
	
	assertF(inMatrix1!=NULL,"in sumArr1_IKByArr2_IK,inMatrix1 is null\n");
	assertF(inMatrix2!=NULL,"in sumArr1_IKByArr2_IK,inMatrix2 is null\n");
	
	sum=0;
	
	for(j=colStart;j<=colEnd;j++)
		sum+=inMatrix1[rowIndex1][j]*inMatrix2[rowIndex2][j];
	
	return sum;
}
/*list data copy*/
void listArrCopy(Type* sourceListArr,Type* targetListArr,int len)
{
	int i;/*iterator num*/
	assertF(sourceListArr!=NULL,"in listArrCopy,sourceListArr is null\n");
	assertF(targetListArr!=NULL,"in listArrCopy,targetListArr is null\n");
	for(i=0;i<len;i++)
		targetListArr[i]=sourceListArr[i];
}

void listArrCopy2(Type* sourceListArr,Type* targetListArr,long sourceStartPos,long targetStartPos,long len)
{
	long i;/*iterator num*/
	long p1,p2;
	assertF(sourceListArr!=NULL,"in listArrCopy2,sourceListArr is null\n");
	assertF(targetListArr!=NULL,"in listArrCop2y,targetListArr is null\n");
	
	p1=sourceStartPos;
	p2=targetStartPos;
	/*init */
	i=0;
	while(i<len)
	{
		targetListArr[p2]=sourceListArr[p1];
		p1++;p2++;
		i++;
	}
}

/*random list data fill in*/
void radnomDataFillToList(Type* listArr,long length)
{
	Type tmpData;
	int i;/*iterator num*/
	
	assertF(listArr!=NULL,"in randomDataFillToList,listArr is null\n");
	srand((unsigned int) time (NULL));
	for(i=0;i<length;i++)
	{
		tmpData=((float)rand()/(float)32767)*(float)10000.0;
		listArr[i]=tmpData;
	}
}

Type eRandom(int upLimit)
{
	Type tmpData;
	do
	{
		tmpData=((Type)rand()/(Type)32767)*(Type)100.0*(Type)upLimit;
	}
	while(tmpData>upLimit);
	
	return tmpData;
}

/*ulti file operation*/
	extern FILE* createFile(char mode,char* fileName)
	{
		FILE* mFile;
		
		assertF(fileName!=NULL,"in createFile,listFileName is null\n");
		assertF(mode=='w'||mode=='r',"in create,mode pass in is error\n");
		if(mode=='w')
			assertF((mFile=fopen(fileName,"wb"))!=NULL,"in create file,output file open error\n");
		else 
			assertF((mFile=fopen(fileName,"rb"))!=NULL,"in create file,output file open error\n");
		
		return mFile;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -