数据结构索引文件的插入删除和查找的c语言代码
时间: 2024-02-15 08:02:15 浏览: 96
数据结构的C语言代码
以下是一个简单的数据结构索引文件的插入、删除和查找的 C 语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_RECORDS 100
// 定义记录的结构体
typedef struct {
int id;
char name[20];
char email[30];
} Record;
// 定义索引的结构体
typedef struct {
int key;
long int pos;
} Index;
// 定义索引文件的结构体
typedef struct {
Index index[MAX_RECORDS];
int count;
} IndexFile;
// 插入索引
void insert(IndexFile *indexFile, int key, long int pos) {
int i;
// 查找插入位置
for (i = indexFile->count - 1; i >= 0 && indexFile->index[i].key > key; i--) {
indexFile->index[i + 1] = indexFile->index[i];
}
indexFile->index[i + 1].key = key;
indexFile->index[i + 1].pos = pos;
indexFile->count++;
}
// 删除索引
void delete(IndexFile *indexFile, int key) {
int i;
// 查找要删除的索引位置
for (i = 0; i < indexFile->count && indexFile->index[i].key != key; i++);
if (i < indexFile->count) {
// 移动后面的索引
for (; i < indexFile->count - 1; i++) {
indexFile->index[i] = indexFile->index[i + 1];
}
indexFile->count--;
}
}
// 查找索引
long int search(IndexFile *indexFile, int key) {
int i;
// 二分查找
int left = 0, right = indexFile->count - 1, mid;
while (left <= right) {
mid = (left + right) / 2;
if (indexFile->index[mid].key == key) {
return indexFile->index[mid].pos;
} else if (indexFile->index[mid].key < key) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 没有找到
}
int main() {
IndexFile indexFile;
indexFile.count = 0;
FILE *dataFile = fopen("data.dat", "rb+");
FILE *indexFile = fopen("index.dat", "wb+");
// 读取数据文件,插入索引
Record record;
long int pos = ftell(dataFile);
while (fread(&record, sizeof(record), 1, dataFile) == 1) {
insert(&indexFile, record.id, pos);
pos = ftell(dataFile);
}
// 根据键值查找记录
int key;
printf("请输入要查找的记录的键值:");
scanf("%d", &key);
pos = search(&indexFile, key);
if (pos != -1) {
fseek(dataFile, pos, SEEK_SET);
fread(&record, sizeof(record), 1, dataFile);
printf("查找成功,记录为:%d %s %s\n", record.id, record.name, record.email);
} else {
printf("没有找到该记录!\n");
}
// 根据键值删除记录
printf("请输入要删除的记录的键值:");
scanf("%d", &key);
delete(&indexFile, key);
// 重新写入索引文件
fseek(indexFile, 0, SEEK_SET);
fwrite(indexFile->index, sizeof(Index), indexFile->count, indexFile);
fclose(dataFile);
fclose(indexFile);
return 0;
}
```
上述代码实现了基于索引文件的数据结构,使用了三个结构体:Record 表示记录,Index 表示索引,IndexFile 表示索引文件。其中 insert、delete 和 search 分别实现了插入、删除和查找操作,主函数中读取数据文件,插入索引,查找记录,删除记录,写入索引文件等操作。注意需要在头文件中引入 stdio.h 和 stdlib.h,以及在编译时链接 math 库。
阅读全文