重新排列数组操作程序的菜单和函数顺序
- 将菜单选项按照插入、删除、修改、查找、排序的顺序重新排列 - 调整函数定义顺序与菜单选项保持一致 - 在每个操作前添加显示当前数组状态的功能 - 优化用户体验,使操作更加直观
This commit is contained in:
+160
-40
@@ -6,6 +6,12 @@
|
|||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 将指令复制到powershell
|
||||||
|
* gcc "数据结构\结构体实现插入元素.c" -o output/结构体实现插入元素.exe
|
||||||
|
.\output\结构体实现插入元素.exe
|
||||||
|
*/
|
||||||
|
|
||||||
// 定义结构体
|
// 定义结构体
|
||||||
typedef struct MyArray
|
typedef struct MyArray
|
||||||
{
|
{
|
||||||
@@ -36,19 +42,6 @@ void insert(MyArray *myArray, int position, int value)
|
|||||||
myArray->size++;
|
myArray->size++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查找函数,返回指定值在数组中的位置,如果未找到返回-1
|
|
||||||
int search(const MyArray *myArray, int value)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < myArray->size; i++)
|
|
||||||
{
|
|
||||||
if (myArray->arr[i] == value)
|
|
||||||
{
|
|
||||||
return i; // 返回找到的位置
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1; // 未找到,返回-1
|
|
||||||
}
|
|
||||||
|
|
||||||
// 删除函数,删除指定位置的元素
|
// 删除函数,删除指定位置的元素
|
||||||
void delete(MyArray *myArray, int position)
|
void delete(MyArray *myArray, int position)
|
||||||
{
|
{
|
||||||
@@ -69,6 +62,68 @@ void delete(MyArray *myArray, int position)
|
|||||||
myArray->size--;
|
myArray->size--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 修改函数,修改指定位置的元素值
|
||||||
|
void modify(MyArray *myArray, int position, int newValue)
|
||||||
|
{
|
||||||
|
if (position < 0 || position >= myArray->size)
|
||||||
|
{
|
||||||
|
// 处理错误情况,例如位置无效
|
||||||
|
printf("Error: Invalid position.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改指定位置的值
|
||||||
|
myArray->arr[position] = newValue;
|
||||||
|
printf("成功将位置 %d 的值修改为 %d\n", position, newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找函数,返回指定值在数组中的位置,如果未找到返回-1
|
||||||
|
int search(const MyArray *myArray, int value)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < myArray->size; i++)
|
||||||
|
{
|
||||||
|
if (myArray->arr[i] == value)
|
||||||
|
{
|
||||||
|
return i; // 返回找到的位置
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1; // 未找到,返回-1
|
||||||
|
}
|
||||||
|
|
||||||
|
// 排序函数,使用冒泡排序对数组进行升序排序
|
||||||
|
void sort(MyArray *myArray)
|
||||||
|
{
|
||||||
|
if (myArray->size <= 1)
|
||||||
|
{
|
||||||
|
printf("数组元素不足,无需排序\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 冒泡排序算法 - 将数组按升序排列
|
||||||
|
// 外层循环:控制排序的轮数,每轮确定一个最大元素的最终位置
|
||||||
|
for (int i = 0; i < myArray->size - 1; i++)
|
||||||
|
{
|
||||||
|
// 内层循环:在未排序部分进行相邻元素比较和交换
|
||||||
|
// 每轮循环后,最大元素会"冒泡"到数组末尾
|
||||||
|
// myArray->size - 1 - i:随着i增加,已排序部分增大,需要比较的元素减少
|
||||||
|
for (int j = 0; j < myArray->size - 1 - i; j++)
|
||||||
|
{
|
||||||
|
// 比较相邻两个元素,如果前面的元素大于后面的元素
|
||||||
|
if (myArray->arr[j] > myArray->arr[j + 1])
|
||||||
|
{
|
||||||
|
// 交换两个元素的位置,使较大的元素向后移动
|
||||||
|
// 使用临时变量temp保存第一个元素的值
|
||||||
|
int temp = myArray->arr[j];
|
||||||
|
// 将第二个元素的值赋给第一个位置
|
||||||
|
myArray->arr[j] = myArray->arr[j + 1];
|
||||||
|
// 将临时保存的值赋给第二个位置,完成交换
|
||||||
|
myArray->arr[j + 1] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("数组排序完成(升序)\n");
|
||||||
|
}
|
||||||
|
|
||||||
// 安全输入函数,获取用户输入的整数值并进行范围检查
|
// 安全输入函数,获取用户输入的整数值并进行范围检查
|
||||||
int getInput(const char *prompt, int min, int max)
|
int getInput(const char *prompt, int min, int max)
|
||||||
{
|
{
|
||||||
@@ -113,7 +168,48 @@ int getInput(const char *prompt, int min, int max)
|
|||||||
// 菜单选择输入函数
|
// 菜单选择输入函数
|
||||||
int getMenuChoice()
|
int getMenuChoice()
|
||||||
{
|
{
|
||||||
return getInput("请选择操作 (1-5): ", 1, 5);
|
return getInput("请选择操作 (1-7): ", 1, 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取插入位置的输入函数
|
||||||
|
int getInsertPosition(const MyArray *myArray)
|
||||||
|
{
|
||||||
|
char prompt[100];
|
||||||
|
sprintf(prompt, "请输入要插入的位置 (0-%d): ", myArray->size);
|
||||||
|
return getInput(prompt, 0, myArray->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取有效位置的通用输入函数(用于删除和修改操作)
|
||||||
|
int getValidPosition(const MyArray *myArray, const char *operation)
|
||||||
|
{
|
||||||
|
if (myArray->size == 0)
|
||||||
|
{
|
||||||
|
printf("错误:数组为空,无法%s元素!\n", operation);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
char prompt[100];
|
||||||
|
sprintf(prompt, "请输入要%s的位置 (0-%d): ", operation, myArray->size - 1);
|
||||||
|
return getInput(prompt, 0, myArray->size - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取删除位置的输入函数
|
||||||
|
int getDeletePosition(const MyArray *myArray)
|
||||||
|
{
|
||||||
|
return getValidPosition(myArray, "删除");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取修改位置的输入函数
|
||||||
|
int getModifyPosition(const MyArray *myArray)
|
||||||
|
{
|
||||||
|
return getValidPosition(myArray, "修改");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取元素值的输入函数
|
||||||
|
int getElementValue(const char *operation)
|
||||||
|
{
|
||||||
|
char prompt[100];
|
||||||
|
sprintf(prompt, "请输入要%s的值 (-1000到1000): ", operation);
|
||||||
|
return getInput(prompt, -1000, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 打印函数,作为结构体外部的成员函数
|
// 打印函数,作为结构体外部的成员函数
|
||||||
@@ -154,11 +250,13 @@ int main(void)
|
|||||||
// 显示菜单
|
// 显示菜单
|
||||||
printf("\n=== 数组操作菜单 ===\n");
|
printf("\n=== 数组操作菜单 ===\n");
|
||||||
printf("1. 插入元素\n");
|
printf("1. 插入元素\n");
|
||||||
printf("2. 查找元素\n");
|
printf("2. 删除元素\n");
|
||||||
printf("3. 删除元素\n");
|
printf("3. 修改元素\n");
|
||||||
printf("4. 打印数组\n");
|
printf("4. 查找元素\n");
|
||||||
printf("5. 退出程序\n");
|
printf("5. 排序数组\n");
|
||||||
printf("请选择操作 (1-5): ");
|
printf("6. 打印数组\n");
|
||||||
|
printf("7. 退出程序\n");
|
||||||
|
printf("请选择操作 (1-7): ");
|
||||||
|
|
||||||
choice = getMenuChoice();
|
choice = getMenuChoice();
|
||||||
|
|
||||||
@@ -166,17 +264,46 @@ int main(void)
|
|||||||
{
|
{
|
||||||
case 1: // 插入元素
|
case 1: // 插入元素
|
||||||
{
|
{
|
||||||
char prompt[100];
|
printf("当前数组: ");
|
||||||
sprintf(prompt, "请输入要插入的位置 (0-%d): ", myArray.size);
|
print(&myArray);
|
||||||
position = getInput(prompt, 0, myArray.size);
|
position = getInsertPosition(&myArray);
|
||||||
value = getInput("请输入要插入的值 (-1000到1000): ", -1000, 1000);
|
value = getElementValue("插入");
|
||||||
insert(&myArray, position, value);
|
insert(&myArray, position, value);
|
||||||
printf("插入操作完成!\n");
|
printf("插入操作完成!\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2: // 查找元素
|
case 2: // 删除元素
|
||||||
value = getInput("请输入要查找的值 (-1000到1000): ", -1000, 1000);
|
{
|
||||||
|
printf("当前数组: ");
|
||||||
|
print(&myArray);
|
||||||
|
position = getDeletePosition(&myArray);
|
||||||
|
if (position != -1)
|
||||||
|
{
|
||||||
|
delete(&myArray, position);
|
||||||
|
printf("删除操作完成!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // 修改元素
|
||||||
|
{
|
||||||
|
printf("当前数组: ");
|
||||||
|
print(&myArray);
|
||||||
|
position = getModifyPosition(&myArray);
|
||||||
|
if (position != -1)
|
||||||
|
{
|
||||||
|
printf("当前位置 %d 的值为: %d\n", position, myArray.arr[position]);
|
||||||
|
value = getElementValue("修改为");
|
||||||
|
modify(&myArray, position, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4: // 查找元素
|
||||||
|
printf("当前数组: ");
|
||||||
|
print(&myArray);
|
||||||
|
value = getElementValue("查找");
|
||||||
foundPos = search(&myArray, value);
|
foundPos = search(&myArray, value);
|
||||||
if (foundPos != -1)
|
if (foundPos != -1)
|
||||||
{
|
{
|
||||||
@@ -188,27 +315,20 @@ int main(void)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3: // 删除元素
|
case 5: // 排序数组
|
||||||
{
|
printf("排序前数组: ");
|
||||||
if (myArray.size == 0)
|
print(&myArray);
|
||||||
{
|
sort(&myArray);
|
||||||
printf("错误:数组为空,无法删除元素!\n");
|
printf("排序后数组: ");
|
||||||
break;
|
print(&myArray);
|
||||||
}
|
|
||||||
char prompt[100];
|
|
||||||
sprintf(prompt, "请输入要删除的位置 (0-%d): ", myArray.size - 1);
|
|
||||||
position = getInput(prompt, 0, myArray.size - 1);
|
|
||||||
delete(&myArray, position);
|
|
||||||
printf("删除操作完成!\n");
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4: // 打印数组
|
case 6: // 打印数组
|
||||||
printf("当前数组: ");
|
printf("当前数组: ");
|
||||||
print(&myArray);
|
print(&myArray);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5: // 退出程序
|
case 7: // 退出程序
|
||||||
printf("程序退出,再见!\n");
|
printf("程序退出,再见!\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user