#include
#include
#include
#include
#include
#include
// 动态数组结构
typedef struct {
void *data; // 数据指针
size_t size; // 元素数量
size_t capacity; // 当前容量
size_t elemSize; // 元素大小
} DynamicArray;
// 初始化动态数组
void initArray(DynamicArray *arr, size_t elemSize) {
arr->data = NULL;
arr->size = 0;
arr->capacity = 0;
arr->elemSize = elemSize;
}
// 添加元素到动态数组
void pushBack(DynamicArray *arr, void *element) {
if (arr->size >= arr->capacity) {
size_t newCapacity = (arr->capacity == 0) ? 4 : arr->capacity * 2;
void *newData = realloc(arr->data, newCapacity * arr->elemSize);
if (!newData) { fprintf(stderr, "内存分配失败\n"); exit(EXIT_FAILURE); } arr->data = newData; arr->capacity = newCapacity; } // 添加新元素 void *dest = (char*)arr->data + arr->size * arr->elemSize; memcpy(dest, element, arr->elemSize); arr->size++;
}
// 释放动态数组内存
void freeArray(DynamicArray *arr) {
free(arr->data);
arr->data = NULL;
arr->size = arr->capacity = 0;
}
// 冒泡排序实现
void bubbleSort(DynamicArray arr, int (compare)(const void, const void)) {
if (arr->size <= 1) return;
for (size_t i = 0; i < arr->size - 1; i++) { bool swapped = false; for (size_t j = 0; j < arr->size - i - 1; j++) { void *elem1 = (char*)arr->data + j * arr->elemSize; void *elem2 = (char*)arr->data + (j + 1) * arr->elemSize; if (compare(elem1, elem2) > 0) { // 交换元素 char temp[arr->elemSize]; memcpy(temp, elem1, arr->elemSize); memcpy(elem1, elem2, arr->elemSize); memcpy(elem2, temp, arr->elemSize); swapped = true; } } // 如果没有交换发生,提前结束 if (!swapped) break; }
}
// 比较函数:整型
int intCompare(const void a, const void b) {
return ((int)a - (int)b);
}
// 比较函数:浮点型
int floatCompare(const void *a, const void *b) {
float diff = (float)a - (float)b;
if (diff > 0.0001) return 1; // 考虑浮点精度
if (diff < -0.0001) return -1;
return 0;
}
// 比较函数:字符型
int charCompare(const void a, const void b) {
return ((char)a - (char)b);
}
// 打印数组
void printArray(DynamicArray *arr, void (printFunc)(void)) {
printf(“[”);
for (size_t i = 0; i < arr->size; i++) {
void elem = (char)arr->data + i * arr->elemSize;
printFunc(elem);
if (i < arr->size - 1) printf(“, “);
}
printf(”]\n”);
}
// 打印整型元素
void printInt(void *elem) {
printf(“%d”, (int)elem);
}
// 打印浮点型元素
void printFloat(void *elem) {
printf(“%.2f”, (float)elem);
}
// 打印字符型元素
void printChar(void *elem) {
printf(“‘%c’”, (char)elem);
}
// 解析用户输入行
void parseInputLine(DynamicArray *arr, const char input,
void (parseFunc)(DynamicArray, const char)) {
parseFunc(arr, input);
}
// 解析整型输入
void parseInt(DynamicArray *arr, const char *input) {
char *token;
char *copy = strdup(input); // 创建可修改的副本
char *ptr = copy;
while (*ptr) { // 跳过非数字字符 while (*ptr && !isdigit(*ptr) && *ptr != '-') ptr++; if (!*ptr) break; // 尝试解析数字 char *end; int value = strtol(ptr, &end, 10); if (end != ptr) { // 成功解析 pushBack(arr, &value); ptr = end; } else { ptr++; } } free(copy);
}
// 解析浮点型输入
void parseFloat(DynamicArray *arr, const char *input) {
char *token;
char *copy = strdup(input);
char *ptr = copy;
while (*ptr) { // 跳过非数字字符 while (*ptr && !isdigit(*ptr) && *ptr != '-' && *ptr != '.') ptr++; if (!*ptr) break; // 尝试解析浮点数 char *end; float value = strtof(ptr, &end); if (end != ptr) { // 成功解析 pushBack(arr, &value); ptr = end; } else { ptr++; } } free(copy);
}
// 解析字符型输入
void parseChar(DynamicArray *arr, const char *input) {
for (const char *p = input; *p != ‘\0’; p++) {
if (!isspace(*p)) {
char value = *p;
pushBack(arr, &value);
}
}
}
// 随机生成数组
void generateRandomArray(DynamicArray *arr, int dataType, int size) {
srand(time(NULL));
for (int i = 0; i < size; i++) { if (dataType == 1) { // 整型 int value = rand() % 100; // 0-99的随机数 pushBack(arr, &value); } else if (dataType == 2) { // 浮点型 float value = (rand() % 1000) / 10.0f; // 0.0-99.9的随机浮点数 pushBack(arr, &value); } else if (dataType == 3) { // 字符型 char value = 'A' + rand() % 26; // A-Z的随机字符 pushBack(arr, &value); } }
}
#include
#include
#include
#include
#include
#include
// 二分法查找函数
bool binarySearch(DynamicArray *arr, void target, int (compare)(const void, const void)) {
size_t left = 0;
size_t right = arr->size - 1;
while (left <= right) { size_t mid = (left + right) / 2; void *midElem = (char*)arr->data + mid * arr->elemSize; int cmp = compare(midElem, target); if (cmp == 0) { return true; // 找到了目标 } else if (cmp < 0) { left = mid + 1; // 向右半部分搜索 } else { right = mid - 1; // 向左半部分搜索 } } return false; // 没有找到目标
}
// 主程序入口
int main() {
int choice;
char buffer[256];
while (1) { printf("\n===== 二分法查找程序 =====\n"); printf("1. 整型查找\n"); printf("2. 浮点型查找\n"); printf("3. 字符型查找\n"); printf("4. 退出程序\n"); printf("请选择操作: "); if (fgets(buffer, sizeof(buffer), stdin) == NULL) break; if (sscanf(buffer, "%d", &choice) != 1) continue; if (choice == 4) break; // 初始化动态数组 DynamicArray arr; void (*printFunc)(void*) = NULL; int (*compareFunc)(const void*, const void*) = NULL; void (*parseFunc)(DynamicArray*, const char*) = NULL; switch (choice) { case 1: // 整型 initArray(&arr, sizeof(int)); printFunc = printInt; compareFunc = intCompare; parseFunc = parseInt; break; case 2: // 浮点型 initArray(&arr, sizeof(float)); printFunc = printFloat; compareFunc = floatCompare; parseFunc = parseFloat; break; case 3: // 字符型 initArray(&arr, sizeof(char)); printFunc = printChar; compareFunc = charCompare; parseFunc = parseChar; break; default: printf("无效选择!\n"); continue; } // 从用户获取数组输入 printf("输入数组元素(空格或逗号分隔): "); if (fgets(buffer, sizeof(buffer), stdin)) { buffer[strcspn(buffer, "\n")] = '\0'; // 移除换行符 parseInputLine(&arr, buffer, parseFunc); } // 对数组进行排序,确保有序 bubbleSort(&arr, compareFunc); // 打印排序后的数组 printf("\n排序后的数组: "); printArray(&arr, printFunc); // 查找目标值 printf("\n输入查找的目标值: "); fgets(buffer, sizeof(buffer), stdin); bool found = false; if (choice == 1) { // 整型查找 int target; sscanf(buffer, "%d", &target); found = binarySearch(&arr, &target, compareFunc); } else if (choice == 2) { // 浮点型查找 float target; sscanf(buffer, "%f", &target); found = binarySearch(&arr, &target, compareFunc); } else if (choice == 3) { // 字符型查找 char target; target = buffer[0]; // 读取首字符 found = binarySearch(&arr, &target, compareFunc); } // 输出查找结果 if (found) { printf("\n查找结果: 找到目标值!\n"); } else { printf("\n查找结果: 未找到目标值!\n"); } // 清理资源 freeArray(&arr); // 询问是否继续 printf("\n继续查找? (y/n): "); if (fgets(buffer, sizeof(buffer), stdin) && (buffer[0] == 'n' || buffer[0] == 'N')) { break; } } return 0;
}
修改代码规范,注释不能出现英文,不能有//注释
最新发布