顺序表–动态创建方式
/**********************************************************
对于线性表中动态创建数组的方式的练习
Description:
主要要求有:
(1)建立一个顺序表,含有n个数据元素。
(2)输出顺序表。
(3)在顺序表中删除值为x的结点或者删除给定位置i的结点。
(4)实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。
(5)输入整型元素序列,利用有序表插入算法建立一个有序表。
(7)在主函数中设计一个简单的菜单,分别测试上述算法。
Author:qichaoqun
Date:2019/07/09
************************************************************/
#include "stdio.h"
#include "stdlib.h"
/*定义int类型的别名*/
typedef int ElemType;
/*定义结构体*/
typedef struct {
//指向数组首地址的指针(数组)
ElemType *data;
//当前数组的长度
int length;
//数组的最大长度
int maxLength;
}SqlList;
/*显示菜单*/
void showMenu();
/*初始化数组*/
bool initList(SqlList &sqlList,int listSize);
/*往数组中添加一个元素*/
bool addElement(SqlList &sqlList,int element);
/*显示所有的元素*/
void showElements(SqlList &sqlList);
/*删除值为 x 的元素*/
bool deleteElementByValue(SqlList &sqlList,int value);
/*删除位置为 i 的元素*/
bool deleteElementByPosition(SqlList &sqlList,int position);
/*修改位置为i上的元素的值*/
bool updateValueByPosition(SqlList &sqlList,int position,int value);
/*将奇数放到偶数之前*/
void sortElementsByOdd(SqlList &sqlList);
/*插入一个序列到数组中去*/
bool insertElements(SqlList &sqlList);
int main(){
//定义数组
SqlList sqlList;
//初始化指针
sqlList.data = nullptr;
while(true){
showMenu();
int option;
scanf("%d",&option);
switch (option){
case 1:
//初始化数组
printf("请输入数组的大小 ");
int size;
scanf("%d",&size);
if(initList(sqlList,size)){
printf("初始化数组成功\n");
}else{
printf("数组已经存在,无法新建\n");
}
continue;
case 2:
//像数组中添加元素
printf("请输入你要添加的元素");
int element;
scanf("%d",&element);
if(addElement(sqlList,element)){
printf("添加成功\n");
}else{
printf("添加失败\n");
}
continue;
case 3:
//删除值为 x 的元素
printf("请输入你要删除的元素的值 ");
int value;
scanf("%d",&value);
if(deleteElementByValue(sqlList,value)){
printf("删除成功\n");
}else{
printf("删除失败,没有找到该值\n");
}
continue;
case 4:
//删除位置为 i 的元素
printf("请输入你要删除的元素的位置 ");
int position;
scanf("%d",&position);
if(deleteElementByPosition(sqlList,position)){
printf("删除成功\n");
}else{
printf("删除失败\n");
}
continue;
case 5:
//修改位置为 i 上的元素
printf("请输入元素的位置和要更改的内容 ");
int positionTo;
int valueTo;
scanf("%d",&positionTo);
scanf("%d",&valueTo);
if(updateValueByPosition(sqlList,positionTo,valueTo)){
printf("修改成功\n");
}else{
printf("修改失败\n");
}
continue;
case 6:
//显示所有的元素
showElements(sqlList);
continue;
case 7:
//将数组中的所有的奇数排在偶数之前
sortElementsByOdd(sqlList);
continue;
case 8:
//插入一个序列到数组中去
if(insertElements(sqlList)){
printf("插入序列成功\n");
}else{
printf("插入序列失败\n");
}
continue;
case 9:
//退出
break;
default:
printf("输入有错,请重新输入");
}
}
};
/*插入一个序列到数组中去*/
bool insertElements(SqlList &sqlList){
printf("请输入你要插入的序列的数量 ");
int count = 0;
scanf("%d",&count);
//判断数组中的空闲位置是否够用
if(count <= (sqlList.maxLength - sqlList.length)){
//空间够用,可以插入
//使用循环得到用户的输入
printf("请输入有序序列 ");
for (int i = 0; i < count; i++) {
int element;
scanf("%d",&element);
sqlList.data[sqlList.length+i] = element;
sqlList.length++;
}
return true;
}
return false;
}
/*将奇数放到偶数之前*/
void sortElementsByOdd(SqlList &sqlList){
//定义用于存放奇数的数组
SqlList oddsList;
oddsList.data = (int*)(malloc(sizeof(ElemType) * sqlList.length));
oddsList.length = 0;
oddsList.maxLength = sqlList.length;
//定义用于存放偶数的数组
SqlList eventsList;
eventsList.data = (int*)malloc(sizeof(ElemType) * sqlList.length);
eventsList.length = 0;
eventsList.maxLength = sqlList.length;
//找到奇数和偶数分别放在不同的数组中
for (int i = 0; i < sqlList.length; i++) {
//判断是否为奇数
if(sqlList.data[i] % 2 == 0){
//为偶数则放入偶数数组中去
oddsList.data[oddsList.length] = sqlList.data[i];
oddsList.length++;
}else{
//放到奇数数组中去
eventsList.data[eventsList.length] = sqlList.data[i];
eventsList.length++;
}
}
//将两个数组合并到一个
SqlList newList;
newList.data = (int*)(malloc(sizeof(ElemType) * (oddsList.length + eventsList.length)));
newList.length = 0;
newList.maxLength = oddsList.length + eventsList.length;
for (int j = 0; j < eventsList.length; j++) {
newList.data[j] = eventsList.data[j];
newList.length++;
}
for (int k = 0; k < oddsList.length; k++) {
newList.data[newList.length+k] = oddsList.data[k];
newList.length++;
}
//输出数组
printf("排列的结果为 ");
for (int l = 0; l < newList.length; l++) {
printf("%d ",newList.data[l]);
}
printf("\n");
}
/*修改位置为i上的元素的值*/
bool updateValueByPosition(SqlList &sqlList,int position,int value){
//判断位置是否合法
if(position < sqlList.maxLength){
//判断该位置上是否有值
if(position < sqlList.length){
//有值则进行修改
sqlList.data[position] = value;
return true;
}
}
return false;
}
/*删除位置为 i 的元素*/
bool deleteElementByPosition(SqlList &sqlList,int position){
//判断位置是否合法
if(position < sqlList.maxLength){
if(position < sqlList.length){
//判断该位置上是否有元素,如果有的话则删除
//位置合法则进行删除
for (int i = position; i < sqlList.length; i++) {
sqlList.data[i] = sqlList.data[i+1];
}
sqlList.length--;
return true;
}
//加入输入的位置合法,但是该位置上没有元素
// 则不需要删除,同时也返回删除成功标志
return true;
}
//只有当位置不合法时返回删除失败标志
return false;
}
/*显示所有的元素*/
void showElements(SqlList &sqlList){
printf("数组中的元素有 ");
for (int i = 0; i < sqlList.length; i++) {
printf("%d ",sqlList.data[i]);
}
printf("\n");
}
/*删除值为x的元素*/
bool deleteElementByValue(SqlList &sqlList,int value){
//设置位置标记值
int flag = 0;
//设置是否找到的标记值
bool isFound = false;
//使用循环找到要删除的值
for (int i = 0; i < sqlList.length; i++) {
flag++;
if(sqlList.data[i] == value){
isFound = true;
break;
}
}
if(isFound){
//找到该元素的情况下,将该元素删除
// 并且其后面所有的元素都向前移动一个位置
for(int i = flag;i < sqlList.length;i++){
sqlList.data[i] = sqlList.data[i+1];
}
sqlList.length--;
return true;
}
return false;
}
/*往数组中添加一个元素*/
bool addElement(SqlList &sqlList,int element){
//判断是否还有空闲位置
if(sqlList.length < sqlList.maxLength){
//将元素添加到数组的尾部
sqlList.data[sqlList.length] = element;
sqlList.length++;
return true;
}
return false;
}
/*初始化数组*/
bool initList(SqlList &sqlList,int listSize){
//数组不存在的情况下,新建数组
if(!sqlList.data){
sqlList.data = (ElemType*)(malloc(sizeof(ElemType) * listSize));
sqlList.length = 0;
sqlList.maxLength = listSize;
return true;
}
//数组存在则不再新建
return false;
}
/*显示菜单*/
void showMenu(){
printf("顺序表的操作\n");
printf("1 初始化顺序表\n");
printf("2 添加一个元素\n");
printf("3 删除值为x的元素\n");
printf("4 删除位置为i的元素\n");
printf("5 修改位置为i的元素\n");
printf("6 显示所有元素\n");
printf("7 奇数排在偶数之前\n");
printf("8 输入一个序列插入到数组中\n");
printf("9 退出\n");
printf("请输入你的选择 \n");
}