#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;
}