数据结构--顺序表

学习日记--顺序表

顺序表:顺序存诸的线性表。
链式表:链式存诸的线性表,简称链表
顺序存储就是将数据存诸到一片连续的内存中,在C语言环境下,可以是具名的栈数
组,或者是诺名的堆数组。
存诸方式不仅仅只是提供数据的存储空间,而是必须要能体现数据之间的逻辑关系。当
采用顺序存诸的方式来放数据时,唯一能用来表达数据日本身的逻辑关系的就是存储
位置。比如队列中的两人人,小明和小花,如果小明在逻辑上排在相的小花的前面
那么在存储位置上也必须把小实验明存放在相的小花的前面。

实验:创建一个顺序表,并从键盘接收数字输入,将输入的正整数按从小到大的顺序插入顺序表,并在输入负整数的时喉将其绝对值数据除。每次输入后
将顺序表的内容打印至屏幕上

#include<stdio.h>
#include<stdbool.h> 
#include<stdlib.h>
#include<string.h>
#include<math.h>
/*
创建一个顺序表,并从键盘接收数字输入,将输入的正整数按从小到大的顺
序插入顺序表,并在输入负整数的时候将其绝对值数据删除。每次输入后,
将顺序表的内容打印到屏幕上。
*/
//0、顺序表的结构体
typedef struct 
{
    int capacity;                                   //顺序表容量
    int last;                                       //最末尾的下标
    int *data;                                      //顺序表 以整形为例
}Sequence_List;

//1、初始化顺序表
Sequence_List* Sequence_init(int cap_size)
{
    //1.给顺序表的结构体申请一个内存空间
    Sequence_List *p = malloc(sizeof(Sequence_List));//不能是p 因为这是一个指针 p的话就只能给指针一个4/8的内存空间,不是给结构体
    if (p == NULL)
    {
        printf("申请空间失败!\n");
        return (Sequence_List*)-1;
    }
    //2.给申请的空间进行赋值
    if (p != NULL)
    {
        p->capacity = cap_size;                     //顺序表的内存空间元素个数
        p->data = malloc(cap_size * sizeof(int));   //申请顺序表的内存空间大小(根据存储类型大小来存储)  看类型的情况注意类型的存储//malloc(cap_size * sizeof(int))表示元素个数malloc(cap_size)表示字节
        p->last = -1;                               //现在的顺序表内存空间没有元素所以下标为-1
    }
    if (p->data == NULL)
    {
        free(p);                                    //申请(顺序表内存)失败,将之前的申请的内存释放
        return NULL;
    }
    //3.初始化一切顺利,将申请的空间(结构体)的地址返回
    return p;
}

//判定是否为空
bool Is_Empty(Sequence_List *p)
{
    return p->last == -1;                           //如果等于-1,说明没有数据 返回true
                                                    //如果不等于1,说明有数据 返回false
}
//判定是否为满
bool Is_Full(Sequence_List *p)
{
    return p->last == p->capacity -1;               //如果等于-1,说明满了 返回true
                                                    //如果不等于1,说明没有满 返回false
}

//2、在顺序表表头插入一个新数据
int Sequence_Insert(Sequence_List *p, int a)
{
    //1.如果满了就返回-1
    if(Is_Full(p))
        return -1;                                  //如果满了,返回-1
                  
    int j= 0;
    //2.将原来的数据向后挪一位
    for (j = p->last; j >= 0; j--)
    {
        p->data[j+1] = p->data[j];
    } 
    //3.将新数据置入表头
    p->data[0] = a;
    //4.将下标后移一位
    p->last++;  
    return 0;                                          //插入成功,返回0
}

//3、在顺序表表头删除一个新数据
int Sequence_Rmsert(Sequence_List *p, int data)
{
    //1.如果空了就返回-1
    if(Is_Empty(p))
        return -1;                                      //如果空了,返回-1
                                                        //2.将原来的数据向前挪一位
    //2.将说有数据全部往前挪一位
    int i= 0;
    for (i = 0; i <= p->last; i++)
    {
        p->data[i] = p->data[i+1];
    }
    //3.将下标后移减1
    p->last--;
    return 0;                                              //删除成功,返回0
}

//4、将顺序表销毁
void Sequence_Destroy(Sequence_List *p)
{
    if (p == NULL)
    {
        return;
    }
    free(p->data);                                          //先销毁结构体里的顺序表堆内存
    p->data = NULL;
    free(p);                                                //再销毁结构体
    p = NULL;
}

//5、显示顺序表
void Show_List(Sequence_List *p)
{
    if(Is_Empty(p))
    {
         //1.如果空了就返回-1
        printf("顺序表为空\n");                             //如果空了,返回-1
        return;
    }
    printf("顺序表为:");
    for(int i = 0; i <= p->last; i++)
    {
        printf("%d ",p->data[i]);
    }
    printf("\n");
}

//6、删除负数的绝对值
int Sequence_Del(Sequence_List *p,int data)
{
    
    //1.如果空了就返回-1
    if(Is_Empty(p))
        return -1;                                          //如果空了,返回-1
    //2.将说有数据全部往前挪一位
    data = -data;
    for (int i = 0; i <= p->last; i++)
    {
        if (p->data[i] == data)
        {
            p->data[i] = p->data[i+1];
            //3.将下标后移减1    
            p->last--;    
        }
    }
    return 0;                                               //删除成功,返回0
}

//7、排序
void Sequence_Sort(Sequence_List *p)
{
    int t  = 0;
    int i = 0;
    for (i = 0; i < p->last; i++)
    {
    
        if (p->data[i] < p->data[i+1])
        {
            int t = p->data[i];
            p->data[i] = p->data[i+1];
            p->data[i+1] = t;
        }
    }
}

//主函数
int main(int argc, char const *argv[])
{
   
    //a、初始化顺序表
    Sequence_List *p = Sequence_init(1280);
    //b、写入数据
    int num = 0;
    printf("请输入你要输入的数据(输入0退出):");   
    while ( scanf("%d",&num) == 1)
    {
        if (num == 0)
        {
            printf("输入结束\n");
            break;
        }    
        if (num > 0)
        {
            //c、插入数据
            Sequence_Insert(p,num);  
            //sleep(1);
            //d、查看顺序表
            Sequence_Sort(p);
            Show_List(p);
        }
        else
        {
            //e、删除数据
            Sequence_Del(p,num);
            Show_List(p);
        } 
    }
    //、销毁顺序表
    Sequence_Destroy(p);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值