C++顺序表练习
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> typedef struct Array { int* data; //存储的数据 int len; //顺序表的个数 int listsize; //顺序表的大小 }array; //输出顺序表中的数据 void printf_list(array* list) { if (list->len == 0) { printf("顺序表为空!\n"); } else { printf("顺序表打印如下:"); for (int i = 0; i < list->len; i++) { printf("%d->", list->data[i]); } printf("end\n"); } } //初始化顺序表空表 array* createArray() { array *temp = (array*)malloc(sizeof(array)); //动态申请顺序表 if (temp == NULL) { printf("顺序表初始化失败!\n"); return NULL; } temp->data = (int *)malloc(sizeof(int) * 5); //动态申请5个int大小给data temp->len = 0; //初始化顺序表长度为0 temp->listsize = 5; //当前顺序表空间大小为5 return temp; } //向顺序表的指定位置插入数据 array* insert_array(array* list) { int i, data; printf("请输入要添加的位置:"); scanf("%d", &i); printf("请输入要添加的元素:"); scanf("%d", &data); if (i<1 || i>list->len + 1) //插入的位置不能小于1,位置从1开始,也不能大于1,因为只能按位置顺序访问并插入数据 { printf("添加的位置不合法!\n"); return 0; } if (list->len == list->listsize) //如果容器已满 { list->data = (int*)realloc(list->data, (list->listsize + 5) * sizeof(int)); //在原有空间上扩容5个int if (list->data == NULL) { printf("扩容失败!\n"); return 0; } list->listsize += 5; //listsize空间大小增加5 } //插入数据 int k; //定义一个局部变量,最终记录i的位置 for (k = list->len - 1; k >= i - 1; k--) //顺序表插入数据,需要将数据先向后挪,找到要插入的位置,将数据插在这个位置 { list->data[k + 1] = list->data[k]; } list->data[i - 1] = data; //将要插入的位置放到 list->len++; //顺序表大小增加1 return list; } //删除指定位置数据 /删除某个元素 /删除重复的元素 array* del_array(array* list) { int i; printf("请输入要删除元素的位置:"); scanf("%d", &i); if (list->len == 0) { printf("空表!\n"); return list; } if (i<1 || i>list->listsize + 1) { printf("删除的位置不合法!\n"); return 0; } if (list->len == 0) { printf("空表!\n"); return list; } int k; for (k = i - 1; k < list->len; k++) //找到要删除的位置的下标,并把后面的元素向前挪 { list->data[k] = list->data[k + 1]; } list->len--; return list; // else if (i == NULL && data != NULL) //如果 // { // // int k; // int num = 0; // for (k = 0; k < list->len; k++) // { // if (list->data[k] == data) // { // list->data[k] = list->data[k + 1]; // k--; // num++; // } // } // list->len -= num; // // } // return list; } //删除重复数据 array *del_all(array* list) { int data; printf("请输入要删除的元素:"); scanf("%d", &data); if (list->len == 0) { printf("空表!\n"); return 0; } int num = 0; //定义一个变量,表示需要删除的元素出现的次数 for (int j = 0; j < list->len; j++) { if (list->data[j] == data) //遍历数组,当当前元素与要删除的元素相同则进入循环 { num++; //元素出现的次数自加1 for (int a = j; a < list->len; a++) //记录当前被删除元素的下标,并开始遍历数组,将后面的元素依次向前挪 { list->data[a] = list->data[a + 1]; } list->len--; //删除完毕,顺序表的元素数-1; j--; //由于后面的数据向前挪,因为结束循环后会自增1,所以此时自减1从原来的位置继续循环 } } if (num == 0) { printf("未找到要删除的元素\n"); return list; } else { printf("删除元素成功\n"); return list; } } //修改指定位置的数据 array* Set_array(array* list) { int i, data; printf("请输入要修改元素的的位置:"); scanf("%d", &i); printf("请输入要即将要替换的元素的值:"); scanf("%d", &data); if (list->len == 0) { printf("空表!\n"); return list; } if (i<1 || i>list->len + 1) //插入的位置不能小于1,位置从1开始,也不能大于1,因为只能按位置顺序访问并插入数据 { printf("位置不合法!\n"); return 0; } if (list->len == list->listsize) //如果容器已满 { list->data = (int*)realloc(list->data, (list->listsize + 5) * sizeof(int)); //在原有空间上扩容5个int if (list->data == NULL) { printf("扩容失败!\n"); return 0; } list->listsize += 5; //listsize空间大小增加5 } list->data[i - 1] = data; return list; } //查询元素的位置 int select_Array(array* list) { int i; printf("请输入要查询的元素的位置:"); scanf("%d", &i); if (list->len == 0) { printf("空表!\n"); return 0; } if (i > list->len) { printf("查询的位置不合法!\n"); return 0; } if (i<1 || i>list->len + 1) //查询的位置不能小于1,位置从1开始,也不能大于1,因为只能按位置顺序访问 { printf("查询的位置不合法!\n"); return 0; } printf("您要查询的位置所在的元素的值为:%d!\n", list->data[i - 1]); return list->data[i - 1]; } //查询的元素对应的位置 int select_Array1(array* list) { int i; printf("请输入要查询的元素:"); scanf("%d", &i); if (list->len == 0) { printf("空表!\n"); return 0; } for (int k = 0; k < list->len; k++) { if (list->data[k] == i) { printf("您要查询的元素%d所在位置为:%d\n", i,k+1 ); return 0; } } printf("未找到您要查询的元素!\n"); } //在指定位置添加多个数据 array* add_somthing(array* list) { int i; printf("请输入要添加的位置:"); scanf("%d", &i); if (i<1 || i>list->len + 1) //插入的位置不能小于1,位置从1开始,也不能大于1,因为只能按位置顺序访问并插入数据 { printf("添加的位置不合法!\n"); return 0; } int num; printf("请输入要添加的元素的数量:"); scanf("%d", &num); int *arr = (int *)malloc(sizeof(int)*num); printf("请输入要添加的元素:\n"); for (int k = 0; k < num; k++) { scanf("%d", &arr[k]); } if (list->len + num > list->listsize) { list->data = (int*)realloc(list->data, (list->listsize + num) * sizeof(int)); //在原有空间上扩容num个int; if (list->data == NULL) { printf("扩容失败!\n"); return 0; } list->listsize += num; //listsize空间大小增加num; } if (list->len == 0) //如果顺序表长度等于0则表示元素没元素,则开始从头插入 { for (int k = 0; k < num; k++) { list->data[k] = arr[k]; } list->len += num; return list; } else { //插入数据; for (int k = list->len - 1; k >= i - 1; k--) //顺序表插入数据,需要将数据先向后挪num个位置; { list->data[k + num] = list->data[k]; //printf("数据data[%d]=data[%d]", list->data[k + num], list->data[k]); } list->len += num; while (num--) //循环遍历数组,将要添加的元素按顺序; { list->data[i - 1 + num] = arr[num]; } return list; } } array* clear_list(array* list) { if (list == NULL ) { printf("当前是空表!\n"); return list; } else { list->len = 0; list->listsize = 5; return list; } } void run() { array* temp = createArray(); while (1) { printf("-----------顺序表操作演示------------\n"); printf("1.创建一个空的顺序表\n"); printf("2.输出顺序表中的所有元素\n"); printf("3.查询顺序表中某个位置的数据\n"); printf("4.查询数据在顺序表中的位置\n"); printf("5.向顺序表中指定位置插入数据\n"); printf("6.删除指定位置的数据\n"); printf("7.修改指定位置的数据\n"); printf("8.删除重复的元素\n"); printf("9.在某个位置插入多个元素\n"); printf("10.退出\n"); printf("11.清空顺序表\n"); printf("-----------请输入你的选择,1-11并确认------------\n"); int num; scanf("%d", &num); system("cls"); switch (num) { case 1: system("cls"); printf("你的选择为:%d\n", num); createArray(); printf("顺序表创建成功!\n"); break; case 2: system("cls"); printf("你的选择为:%d\n", num); printf_list(temp); break; case 3: system("cls"); printf("你的选择为:%d\n", num); select_Array(temp); break; case 4: system("cls"); printf("你的选择为:%d\n", num); select_Array1(temp); printf_list(temp); break; case 5: system("cls"); printf("你的选择为:%d\n", num); insert_array(temp); printf_list(temp); break; case 6: system("cls"); printf("你的选择为:%d\n", num); del_array(temp); printf_list(temp); break; case 7: system("cls"); printf("你的选择为:%d\n", num); Set_array(temp); printf_list(temp); break; case 8: system("cls"); printf("你的选择为:%d\n", num); del_all(temp); printf_list(temp); break; case 9: system("cls"); printf("你的选择为:%d\n", num); add_somthing(temp); printf_list(temp); break; case 10: exit(0); break; case 11: system("cls"); printf("你的选择为:%d\n", num); clear_list(temp); printf_list(temp); break; default: break; } } } int main() { run(); return 0; }