数据结构——学习笔记—顺序表及其实现(含全部代码)

本文作者分享了考研期间对数据结构中顺序表的复习过程,包括使用动态分配实现顺序表的基本操作,如插入、删除、查找等,并提供了控制台操作的封装示例。
摘要由CSDN通过智能技术生成

最近在准备考研复试,科目是数据结构,参考书为严蔚敏版数据结构教材以及王道数据结构考研辅导书,想做一点学习记录,代码是看了视频之后学习到了思路然后自己写的,可能会存在不足或者错误,本着交流学习的心,有任何建议或者错误,请提出宝贵的意见,感谢!

今天主要是使用了动态分配的方式写了顺序表的一些基本操作,最后做了一点封装,可以在控制台操作

Project: sequence_list(数据结构-顺序表)
Date: 2024/01/30
Author: Lasthai
InitList(sequence_table &L) 参数:顺序表L 功能:初始化 时间复杂度:O(1)
increasesize(sequence_table &L,int increase_len) 参数:顺序表L,增大长度 功能:增加顺序表的长度
ListInsert(sequence_table &L,int pos,int element) 参数:顺序表L,位置pos,元素element 功能:位置pos(从0开始)处插入元素element 时间复杂度:O(n)
push_element(sequence_table &L,int element) 参数:顺序表L,元素element 功能:末尾插入元素element 时间复杂度:O(1)
ListDelete(sequence_table &L,int pos,int &element) 参数:顺序表L,位置pos,被删除的元素element 功能:删除位置pos(从0开始)处元素并回代值 时间复杂度:O(n)
locateElem(sequence_table L ,int element) 参数:顺序表L,元素e 功能:返回第一个等于element的元素的位置 时间复杂度:O(n)
get_value(sequence_table L,int pos)参数:顺序表L,位置pos 功能:返回位置pos的元素值 时间复杂度:O(n)
print_Elem(sequence_table L)参数:顺序表L 功能:遍历L,并输出
List_reverse(sequence_table &L) 参数:顺序表L 倒置函数 将原顺序表直接倒置
Destroy_List(sequence_table &L)参数:顺序表L 功能:清空顺序表

顺序表的定义

静态分配

//静态分配定义
struct sequence_table   
{
    int data[init_maxsize];
    int length;
};
void InitList(sequence_table &L)//静态分配的初始化
{
    for (int i = 0; i < init_maxsize; i++)
    {
        L.data[i]=0;
    }
    
    L.length=0;
}

动态分配

 //动态分配定义
struct sequence_table 
{
    int *data;
    int length;
    int Max_size;
};

//动态分配的初始化
void InitList(sequence_table &L)
{   //手动开辟堆空间,后期手动free
    L.data=(int*)malloc(sizeof(int)*init_maxsize);
    L.length=0;
    L.Max_size=init_maxsize;
}

基本操作

//**基本操作*********************************************************************************************

//在pos位置插入数据elemen(pos从0开始)
bool  ListInsert(sequence_table &L,int pos,int element)
{
    if (L.length==L.Max_size )
    {
        printf("The table is full\n");
        return false;
    }
    if (pos<0 || pos>L.Max_size)//判断插入位置非法
    {
        printf("Invalid pos\n");
        return false;
    }
    else if(pos<=L.length)//如果插入位置已有插入元素,需要先把元素后移
    {
        for (int i = L.length; i >= pos ; i--)
        {
            L.data[i]=L.data[i-1];
        }
    }
    
    L.data[pos]=element;
    L.length++;
    return true;
}

//尾插元素element
bool push_element(sequence_table &L,int element)
{
    if (L.length==L.Max_size )
    {
        printf("The table is full\n");
        return false;
    }
    L.data[L.length]=element;
    L.length++;
}

//删除pos位置的元素,并记录删除元素的值
bool ListDelete(sequence_table &L,int pos,int &element)
{
    element=L.data[pos];
    if (pos<0 || pos>=L.length)//判断位置非法
    {
        printf("Invalid pos\n");
        return false;
    }
    for (int i = pos; i < L.length; i++)
    {
        L.data[i]=L.data[i+1];  //元素前移把要删除的元素位置直接覆盖
    }
    L.length--;
    return true;
}

//获取顺序表当前长度
int get_List_Len(sequence_table L)
{
    return L.length;
}

//按值查找位置并返回(位置从0开始)
int locateElem(sequence_table L ,int element)
{
    for (int i = 0; i < L.length; i++)//依次遍历找到值后返回下标
    {
        if (L.data[i]==element)
        {
            return i;
        }
    }
    return -1;//未找到则返回-1
    
}

//按位查值并返回(pos从0开始)
int get_value(sequence_table L,int pos)
{
    if (pos<0||pos>=L.length)
    {
        return -1;
    }
    return L.data[pos];
}

//判空
bool is_empty(sequence_table L)
{
    if (L.length==0)
    {
        return true; 
    }
}

//输出表中元素
void print_Elem(sequence_table L)
{
    for (int i = 0; i < L.length; i++)
    {   
        printf("the %d element :%d\n",i,L.data[i]);
    }
}

//清空表
void Destroy_List(sequence_table &L)
{
    L.length=0;
}

//元素反转
void List_reverse(sequence_table &L)
{
    int *temp;
    int j=0;
    temp=(int*)malloc(sizeof(int)*L.length);
    for (int i = 0; i < L.length; i++)//定义temp暂存数据
    {
        temp[i]=L.data[i];
    }
    for (int i = L.length-1; i >= 0; i--)//倒序把数据存回去
    {
        L.data[i]=temp[j];
        j++;
    }
    free(temp);
    j=0;
}

控制台界面封装

//界面功能封装*******************************************************************************************

//建表
void create_table(sequence_table &L)
{
    int element;
    printf("Please input value to create: press 000 to stop\n");
    while (1)
    {
        scanf("%d",&element);
        if (element==000)
        {
            return;
        }
        push_element(L,element);
    }   
}

//插入元素
void Insert(sequence_table &L)
{
    int pos,value;
    printf("Please input inserting_position and value:\n");
    printf("format:1 2\n");
    scanf("%d %d",&pos,&value);
    ListInsert(L,pos,value);
}

//删除元素
void Delete(sequence_table &L)
{
    int pos,value;
    printf("Please input deleting_position:\n");
    scanf("%d",&pos);
    ListDelete(L,pos,value);
    printf("%d was deleted\n",value);
}


//查找值位置
void Search_pos(sequence_table L)
{
    int value,pos;
    printf("Please input value to find the position\n");
    scanf("%d",&value);
    pos=locateElem(L,value);
    printf("the position of value:%d is %d",value,pos);
}


//查找位置值
void search_value(sequence_table L)
{
    int value,pos;
    printf("Please input position to find value\n");
    scanf("%d",&pos);
    value=get_value(L,pos);
    printf("the value of the %d is %d",pos,value);
}

void menu()
{
    printf("**********1.create             2.insert**********\n");
    printf("**********3.delete             4.search for pos**********\n");
    printf("**********5.search for value   6.print**********\n");
    printf("**********7.clear              8.reverse**********\n");
    printf("**********9.Exit                  **********\n");
}

//**************************

实现效果

在这里插入图片描述
在这里插入图片描述

全部代码

/*
Project: sequence_list(数据结构-顺序表)
Date:    2024/01/30  
Author:  Lasthai
InitList(sequence_table &L) 参数:顺序表L 功能:初始化 时间复杂度:O(1)
increasesize(sequence_table &L,int increase_len) 参数:顺序表L,增大长度  功能:增加顺序表的长度
ListInsert(sequence_table &L,int pos,int element) 参数:顺序表L,位置pos,元素element 功能:位置pos(从0开始)处插入元素element 时间复杂度:O(n)
push_element(sequence_table &L,int element) 参数:顺序表L,元素element 功能:末尾插入元素element 时间复杂度:O(1)
ListDelete(sequence_table &L,int pos,int &element) 参数:顺序表L,位置pos,被删除的元素element 功能:删除位置pos(从0开始)处元素并回代值 时间复杂度:O(n)
locateElem(sequence_table L ,int element) 参数:顺序表L,元素e 功能:返回第一个等于element的元素的位置 时间复杂度:O(n)
get_value(sequence_table L,int pos)参数:顺序表L,位置pos 功能:返回位置pos的元素值 时间复杂度:O(n)
print_Elem(sequence_table L)参数:顺序表L 功能:遍历L,并输出
List_reverse(sequence_table &L) 参数:顺序表L 倒置函数 将原顺序表直接倒置
Destroy_List(sequence_table &L)参数:顺序表L 功能:清空顺序表
*/

#include<stdio.h>
#include<malloc.h>
#define init_maxsize 10


// //静态分配定义
// struct sequence_table   
// {
//     int data[init_maxsize];
//     int length;
// };
// void InitList(sequence_table &L)//静态分配的初始化
// {
//     for (int i = 0; i < init_maxsize; i++)
//     {
//         L.data[i]=0;
//     }
    
//     L.length=0;
// }


 //动态分配定义
struct sequence_table 
{
    int *data;
    int length;
    int Max_size;
};

//动态分配的初始化
void InitList(sequence_table &L)
{   //手动开辟堆空间,后期手动free
    L.data=(int*)malloc(sizeof(int)*init_maxsize);
    L.length=0;
    L.Max_size=init_maxsize;
}

//增大顺序表的容量,增加值increase_len
void increasesize(sequence_table &L,int increase_len)
{
    sequence_table temp_L=L;
    //int *temp_L=L.data;      
    //temp_L=L;
    //L.data=(sequence_table*)malloc(sizeof*(sequence_table)*L.Max_size+increase_len);
    L.data=(int*)malloc(sizeof(int)*(L.Max_size+increase_len));
    for (int i = 0; i < L.length; i++)
    {
        //未验证是否可以赋值
        L.data[i]=temp_L.data[i];
        //L.data[i]=temp_L[i];

    }
    L.Max_size=L.Max_size+increase_len;
}


//**基本操作*********************************************************************************************

//在pos位置插入数据elemen(pos从0开始)
bool  ListInsert(sequence_table &L,int pos,int element)
{
    if (L.length==L.Max_size )
    {
        printf("The table is full\n");
        return false;
    }
    if (pos<0 || pos>L.Max_size)//判断插入位置非法
    {
        printf("Invalid pos\n");
        return false;
    }
    else if(pos<=L.length)//如果插入位置已有插入元素,需要先把元素后移
    {
        for (int i = L.length; i >= pos ; i--)
        {
            L.data[i]=L.data[i-1];
        }
    }
    
    L.data[pos]=element;
    L.length++;
    return true;
}

//尾插元素element
bool push_element(sequence_table &L,int element)
{
    if (L.length==L.Max_size )
    {
        printf("The table is full\n");
        return false;
    }
    L.data[L.length]=element;
    L.length++;
}

//删除pos位置的元素,并记录删除元素的值
bool ListDelete(sequence_table &L,int pos,int &element)
{
    element=L.data[pos];
    if (pos<0 || pos>=L.length)//判断位置非法
    {
        printf("Invalid pos\n");
        return false;
    }
    for (int i = pos; i < L.length; i++)
    {
        L.data[i]=L.data[i+1];  //元素前移把要删除的元素位置直接覆盖
    }
    L.length--;
    return true;
}

//获取顺序表当前长度
int get_List_Len(sequence_table L)
{
    return L.length;
}

//按值查找位置并返回(位置从0开始)
int locateElem(sequence_table L ,int element)
{
    for (int i = 0; i < L.length; i++)//依次遍历找到值后返回下标
    {
        if (L.data[i]==element)
        {
            return i;
        }
    }
    return -1;//未找到则返回-1
    
}

//按位查值并返回(pos从0开始)
int get_value(sequence_table L,int pos)
{
    if (pos<0||pos>=L.length)
    {
        return -1;
    }
    return L.data[pos];
}

//判空
bool is_empty(sequence_table L)
{
    if (L.length==0)
    {
        return true; 
    }
}

//输出表中元素
void print_Elem(sequence_table L)
{
    for (int i = 0; i < L.length; i++)
    {   
        printf("the %d element :%d\n",i,L.data[i]);
    }
}

//清空表
void Destroy_List(sequence_table &L)
{
    L.length=0;
}

//元素反转
void List_reverse(sequence_table &L)
{
    int *temp;
    int j=0;
    temp=(int*)malloc(sizeof(int)*L.length);
    for (int i = 0; i < L.length; i++)//定义temp暂存数据
    {
        temp[i]=L.data[i];
    }
    for (int i = L.length-1; i >= 0; i--)//倒序把数据存回去
    {
        L.data[i]=temp[j];
        j++;
    }
    free(temp);
    j=0;
}
//****************************************************************************************************






//界面功能封装*******************************************************************************************

//建表
void create_table(sequence_table &L)
{
    int element;
    printf("Please input value to create: press 000 to stop\n");
    while (1)
    {
        scanf("%d",&element);
        if (element==000)
        {
            return;
        }
        push_element(L,element);
    }   
}

//插入元素
void Insert(sequence_table &L)
{
    int pos,value;
    printf("Please input inserting_position and value:\n");
    printf("format:1 2\n");
    scanf("%d %d",&pos,&value);
    ListInsert(L,pos,value);
}

//删除元素
void Delete(sequence_table &L)
{
    int pos,value;
    printf("Please input deleting_position:\n");
    scanf("%d",&pos);
    ListDelete(L,pos,value);
    printf("%d was deleted\n",value);
}


//查找值位置
void Search_pos(sequence_table L)
{
    int value,pos;
    printf("Please input value to find the position\n");
    scanf("%d",&value);
    pos=locateElem(L,value);
    printf("the position of value:%d is %d",value,pos);
}


//查找位置值
void search_value(sequence_table L)
{
    int value,pos;
    printf("Please input position to find value\n");
    scanf("%d",&pos);
    value=get_value(L,pos);
    printf("the value of the %d is %d",pos,value);
}

void menu()
{
    printf("**********1.create             2.insert**********\n");
    printf("**********3.delete             4.search for pos**********\n");
    printf("**********5.search for value   6.print**********\n");
    printf("**********7.clear              8.reverse**********\n");
    printf("**********9.Exit                  **********\n");
}

//**********************************************************************************************


int main()
{
    int e=-1;
    int choice;
    sequence_table L;
    InitList(L);
    while (1)
    {
        int p;
        menu();
        while (1)//此循环用来判断非数字的字符
        {
            printf("Enter your choice:");
            if (scanf("%d",&choice))
                break;
            else
                {
                    printf("Invalid input!Please enter a number.\n");
                    while (getchar()!='\n');//清楚缓存
                }
        }
        
      
        switch (choice)
        {
            case 1:create_table(L); break;
            case 2:Insert(L); break;
            case 3:Delete(L); break;
            case 4:Search_pos(L); break;
            case 5:search_value(L); break;
            case 6:print_Elem(L); break;
            case 7:Destroy_List(L); break;
            case 8:List_reverse(L);break;
            case 9: free(L.data);  
                        return 0;
            default:printf("input error!!!,Please enter again:\n");
        }
    }
    free(L.data);
    return 0;
}


  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值