数据结构_day02_线性表

线性表:

  线性表:==》逻辑结构 ==》 抽象数据类型
      ==》存储结构 ==》  顺序存储(顺序表)
                                                      链式存储(单链表、双链表)

  线性表逻辑结构:
    线性表(List):由n(n>=0)个同类型数据元素构成的有限序列
    顺序表(SeqList):数据元素按地址连续有序排列的线性表(静态存储   例如数组,)
    链表(Linked List):数据元素通过指针联系在一起的地址不连续排列的线性表(动态存储)

  线性表存储结构:
    学会写顺序表(增删查改)  单链表、双链表、双向循环链表

顺序表

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#define Seqlist_initsize 9

typedef struct Seqlist
{
    int capacity;   //顺序表容量(上限)
    int size;       //顺序表存放元素实际数量
    int* base;      //指向动态内存分配的指针
}Seqlist;

Seqlist* init_list(Seqlist* list)                   //初始化顺序表需要返回Seqlist* 类型
{
    list->capacity = Seqlist_initsize;              //初始化容量定为9(宏定义操作)
    list->size = 0;                                    //初始化实际存储数量为0
    list->base = (int*)calloc(1, sizeof(Seqlist));  //使用calloc给指针分配内存,注意头文件
    //list->base 可以作为数组指针,配合list->base[list->size]使用,但只在插入时候这样写
    if(list->base == NULL)                        //创建失败就返回空值结束
    {
        perror("->顺序表创建失败!\n");
        return NULL;
    }
    return list;                               //创建成功就返回list指针
}
//初始顺序表


void show_list(Seqlist* list)
{
    printf("->打印结果为: \n  ");
    for (int i = 0; i < list->size; i++)
    {
        printf("%d ", list->base[i]);
    }
    printf("\n");
}
//打印顺序表元素

void insert_list(Seqlist *list )
{

    int insert_key;
    printf("->请输入需要出入的值:\n");
    for (int i = 1; i <= list->capacity; i++)
    {
        scanf("%d", &insert_key);          
        list->base[list->size] = insert_key;     //插入操作,只有这里使用list->size作为数组下标,其他地方不要这样用
        list->size++;                            //插入完成一次,当前数量加1
    }
    show_list(list);
}
//插入顺序表元素



void delete_list(Seqlist* list)
{
    printf("->请输入需要删除的元素:\n");
    int delete_key;
    int panduan = 1;

    scanf("%d",&delete_key);
    for (int i = 0; i < list->size; i++)
    {
        if (delete_key == list->base[i])
        {    
            for (int j = i; j < list->size; j++)
            {
                list->base[j] = list->base[j + 1];   //覆盖
            }
            list->size--;            //每实现一个if,意味着删除一个,当前数量减1
            i--;              //这里一定要将i--,重新变回迁移之前的位置,不然会漏掉数据
            panduan = 0;      //这里的panduan是用来判断是否查找的符合删除条件的值的
        }
    }
    if (panduan)
    {
        printf("->未能找到需要删除的数据\n");
    }
    show_list(list);
}
//删除顺序表元素




void find_list(Seqlist* list)
{
    int find_key;
    int panduan = 1;
    printf("->请输入需要查找的元素:\n");
    scanf("%d",&find_key);
    for (int i = 0; i < list->size; i++)
    {
        if (find_key == list->base[i])
        {
            printf("->查找到数据为下标[%d]数据,—— %d   \n",i,list->base[i]);
            panduan = 0;
        }
    }
    if (panduan)
    {
        printf("->未能查找到需要查找的数据\n");
    }
    show_list(list);
}
//查找顺序表元素



void change_list(Seqlist* list)
{
    int change_number,change_key;
    printf("->请输入需要更改的下标位置:\n");
    scanf("%d",&change_number);
    printf("->请输入将对应数据更改后的值:\n");
    scanf("%d", &change_key);
    list->base[change_number] = change_key;       //直接改
    show_list(list);
}
//更改顺序表元素

int main()
{
    
    Seqlist List;            //创建顺序表List
    init_list(&List);        //顺序表初始化

    int choose;
    while (1)
    {
        printf("﹃﹃﹃﹃﹃﹃﹄﹄﹄﹄﹃﹃  \n");
        printf("    1、插入元素    \n");
        printf("    2、删除元素    \n");
        printf("    3、查找元素    \n");
        printf("    4、更改元素    \n");
        printf("    5、打印元素    \n");
        printf("﹄﹄﹄﹄﹄﹄﹃﹃﹃﹃﹃﹃  \n");

        printf("请输入需要进行操作的选项!\n");
        scanf("%d", &choose);
        switch (choose)
        {
        case 1: insert_list(&List);    break;    //插入元素
        case 2: delete_list(&List);    break;    //删除元素
        case 3: find_list(&List);    break;    //查找元素
        case 4: change_list(&List);    break;    //更改元素
        case 5: show_list(&List);    break;  //打印元素
        default:printf("选项输入错误!请重新输入!\n");
            break;
        }
    }

    return 0;
}


/*
*提示:看懂后,大胆写!
*/

 

posted @ 2022-03-14 21:43  尘落曦枫  阅读(161)  评论(0)    收藏  举报