?? algo11-3.c
字號:
/* algo11-3.c 將algo11-2.c產生的有序子文件f0,f1,f2歸并成1個有序的大文件out */
#include"c1.h"
typedef int InfoType; /* 定義其它數據項的類型 */
#include"c10-1.h" /* 定義KeyType、RedType及SqList */
#define k 3 /* k路歸并 */
#define M 10 /* 設輸出M個數據換行 */
#include"bo11-1.c"
void print(RedType t)
{
printf("(%d,%d)",t.key,t.otherinfo);
}
void main()
{
RedType r;
int i,j;
char fname[k][4],fout[5]="out",s[3];
LoserTree ls;
for(i=0;i<k;i++)
{ /* 依次打開f0,f1,f2,…,k個文件 */
itoa(i,s,10); /* 生成k個文件名f0,f1,f2,… */
strcpy(fname[i],"f");
strcat(fname[i],s);
fp[i]=fopen(fname[i],"rb"); /* 以讀的方式打開文件f0,f1,… */
printf("有序子文件f%d的記錄為:\n",i);
do
{
j=fread(&r,sizeof(RedType),1,fp[i]); /* 依次將f0,f1,…的數據讀入r */
if(j==1)
print(r); /* 輸出r的內容 */
}while(j==1);
printf("\n");
rewind(fp[i]); /* 使fp[i]的指針重新返回f0,f1,…的起始位置,以便重新讀入內存 */
}
fp[k]=fopen(fout,"wb"); /* 以寫的方式打開大文件fout */
K_Merge(ls,b); /* 利用敗者樹ls將k個輸入歸并段中的記錄歸并到輸出歸并段,即大文件fout */
for(i=0;i<=k;i++)
fclose(fp[i]); /* 關閉文件f0,f1,…和文件fout */
fp[k]=fopen(fout,"rb"); /* 以讀的方式重新打開大文件fout驗證排序 */
printf("排序后的大文件的記錄為:\n");
i=1;
do
{
j=fread(&r,sizeof(RedType),1,fp[k]); /* 將fout的數據讀入r */
if(j==1)
print(r); /* 輸出r的內容 */
if(i++%M==0)
printf("\n"); /* 換行 */
}while(j==1);
printf("\n");
fclose(fp[k]); /* 關閉大文件fout */
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -