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

  

原文链接: https://www.cnblogs.com/shenji/p/12544422.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++顺序表练习

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/336837

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午10:52
下一篇 2023年3月1日 下午10:53

相关推荐