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

  

posted @ 2020-03-22 10:45  神迹丶  阅读(215)  评论(0编辑  收藏  举报
网站已运行: