#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>#define MaxRec 100typedef struct Index
{char num
[8];long offset
;
}Index
;typedef struct sdata
{char num
[8];char name
[10];int sex
;int age
;char addr
[30];char dep
[20];char spec
[20];
}Student
;void DelAll()
{FILE
*mfile
,*idxfile
;if((mfile
=fopen("main.dat","wb"))==NULL){printf(">>不能打開主文件\n");return;}if((idxfile
=fopen("idx.dat","wb"))==NULL){printf(">>不能打開索引文件\n");return;}fclose(mfile
);fclose(idxfile
);
}void InsertSort(Index r
[],int n
)
{int i
,j
;Index temp
;for(i
=1;i
<n
;i
++){temp
=r
[i
];j
=i
-1;while(j
>=0 && strcmp(temp
.num
,r
[j
].num
)<0){r
[j
+1]=r
[j
];j
--;}r
[j
+1]=temp
;}
}void CreatIdxFile()
{FILE
*mfile
,*idxfile
;Index idx
[MaxRec
];Student st
;int n
=0,i
;if((mfile
=fopen("main.dat","rb"))==NULL){printf(">>不能打開主文件\n");return;}if((idxfile
=fopen("index.dat","wb"))==NULL){printf(">>不能建立索引文件\n");return;}i
=0;while((fread(&st
,sizeof(Student
),1,mfile
))!=NULL){strcpy(idx
[i
].num
,st
.num
);idx
[i
].offset
=++n
;i
++;}InsertSort(idx
,n
);rewind(idxfile
);for(i
=0;i
<n
;i
++)fwrite(&idx
[i
],sizeof(Index
),1,idxfile
);fclose(mfile
);fclose(idxfile
);
}void InputMainFile()
{FILE
*mfile
;Student st
;mfile
=fopen("main.dat","ab+");if(mfile
==NULL){printf(">>不能建立主文件\n");return;}printf(">>學(xué)號(hào),姓名,性別,年齡,地址,系別,專業(yè):");scanf("%s%s%d%d%s%s%s",st
.num
,st
.name
,&st
.sex
,&st
.age
,st
.addr
,st
.dep
,st
.spec
);if(fwrite(&st
,sizeof(Student
),1,mfile
)!=1){printf(">> 寫主文件錯(cuò)誤\n");return;}fclose(mfile
);
}void OutputMainFile()
{FILE
*mfile
;Student st
;int i
=0;mfile
=fopen("main.dat","rb");if(mfile
==NULL){printf(">>不能讀主文件\n");return;}while((fread(&st
,sizeof(Student
),1,mfile
))!=NULL){printf(">> 記錄號(hào)%d:",++i
);printf("%s%s%d%d%s%s%s\n",st
.num
,st
.name
,st
.sex
,st
.age
,st
.addr
,st
.dep
,st
.spec
);}fclose(mfile
);
}void OutputIdxFile()
{FILE
*idxfile
;Index irec
;int i
=0;idxfile
=fopen("index.dat","rb");if(idxfile
==NULL){printf(">>不能讀索引文件\n");return;}while((fread(&irec
,sizeof(Index
),1,idxfile
))!=NULL)printf(">>(學(xué)號(hào):記錄號(hào))%s: %d\n",irec
.num
,irec
.offset
);fclose(idxfile
);
}void ReadIndexFile(Index idx
[MaxRec
],int &len
)
{FILE
*idxfile
;int j
;if((idxfile
=fopen("index.dat","rb"))==NULL){printf(">>索引文件不能打開\n");return;}fseek(idxfile
,0,2);j
=ftell(idxfile
);len
=j
/sizeof(Index
);fread(idx
,sizeof(Index
),len
,idxfile
);fclose(idxfile
);
}int SearchNum(Index idx
[],int len
,char no
[])
{int mid
,low
,high
,comp
;low
=0;high
=len
-1;while(low
<=high
){mid
=(low
+high
)/2;comp
=strcmp(idx
[mid
].num
,no
);if(comp
>0)high
=mid
-1;else if(comp
<0)low
=mid
+1;else return idx
[mid
].offset
;}return -1;
}void FindStudent()
{FILE
*mfile
;char no
[8];Index idx
[MaxRec
];Student st
;int i
,len
;mfile
=fopen("main.dat","rb+");if(mfile
==NULL){printf(">>主文件中沒有任何記錄\n");return;}ReadIndexFile(idx
,len
);printf("輸入學(xué)號(hào):");scanf("%s",no
);i
=SearchNum(idx
,len
,no
);if(i
==-1)printf(">>學(xué)號(hào) %s 不存在\n",no
);else{fseek(mfile
,(i
-1)*sizeof(Student
),SEEK_SET);fread(&st
,sizeof(Student
),1,mfile
);printf(">>%s%s%d%d%s%s%s\n",st
.num
,st
.name
,st
.sex
,st
.age
,st
.age
,st
.dep
,st
.spec
);}fclose(mfile
);
}int main()
{int sel
;do{printf("1:輸入 2:輸入主文件 3:輸出索引文件 4:按學(xué)號(hào)查找 9:全清 0:退出:");scanf("%d",&sel
);switch(sel
){case 9:DelAll();case 1:InputMainFile();CreatIdxFile();break;case 2:OutputMainFile();break;case 3:OutputIdxFile();break;case 4:FindStudent();break;}}while(sel
!=0);return 0;
}
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言描述)匯總:
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):英文單詞按字典序排序的基數(shù)排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):直接插入排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):直接選擇排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):置換-選擇算法
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):Huffman樹字符編碼
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):Josephus問題之順序表
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):Josephus問題之循環(huán)鏈接表
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):多項(xiàng)式合并
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):二叉樹之葉子結(jié)點(diǎn)旋轉(zhuǎn)銷毀
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):哈夫曼樹
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):集合的位向量表示
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):鏈接隊(duì)列
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):鏈接棧
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):線性表的單鏈表示
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):線性表的順序表示
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):棧的基本操作
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):中綴表達(dá)式
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):希爾插入排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):索引文件建立和查找
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):冒泡排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):快速排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):可變長(zhǎng)度字符串的快速排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):基數(shù)排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):二路歸并排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):堆排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):二叉樹搜索樹Kruskal
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):二叉搜索樹Prim
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):最短路徑弗洛伊德算法
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):深度、廣度優(yōu)先生成樹
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):鄰接矩陣轉(zhuǎn)化鄰接表
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):統(tǒng)計(jì)字符串中出現(xiàn)的字符及其次數(shù)
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):順序查找
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):哈希表的相關(guān)運(yùn)算算法
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):分塊法查找
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):二分查找
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):二叉樹遍歷
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):二叉平衡樹的相關(guān)操作算法
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):二叉排序樹的基本操作算法
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語(yǔ)言):B樹的相關(guān)運(yùn)算算法
總結(jié)
以上是生活随笔為你收集整理的数据结构源码笔记(C语言):索引文件建立和查找的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。