数据结构的顺序表的学习

**1、基本概念(**如何有效的高效的研究数据的存储)

数据结构是一门研究如何有效组织数据,并提高数据处理效率的学科。通过研究各种数据内部的逻辑关系,使用某种特定的存储形式,并在此基础上对数据实施各种操作,这些工作被称为称为广义上的算法。

  • 逻辑结构:线性表,集合,树,图等结构

2、顺序表

  1. 基本概念:顺序存储的线性表;如果有n个元素,其中一个a元素有且只有一个前驱a-1,有且只有一个后去a+1,首元素没有前驱a0-1,尾元素没有后驱an+1;当中的数据是一个挨着一个的,常被称为一对一关系。反之,如果数据之间的关系不是一对一的,就是非线性的。
  • 顺序存储就是将数据存储到一片连续的内存中,在C语言环境下,可以是具名的栈数组,或者是匿名的堆数组。

顺序表的设计:

  1. 设计一个专门管理顺序表的"管理结构体",管理结构体中一般会包含:
  • 顺序表总容量

  • 顺序表当前最末元素下标位置

  • 顺序表指针

    struct seq
    {
    int cap; // 顺序表容量
    int last; // 最末元素下标
    int * data; // 顺序表,以整型数据为例
    };

2.初始化顺序表:

复制代码
//初始化顺序数据表
struct seq *init_callloc(int cap)
{
    struct seq *p=calloc(1,sizeof(struct seq));
    if (p!=NULL)
    {
        p->cap=cap;
        p->last=0;
        p->data=calloc(1,sizeof (int)*cap);
        if (p->data!=NULL)
            return p;
        else
            free(p); 
    }
}

3.增删,遍历,查找节点:

复制代码
//判断是否为空
bool seq_Empty(struct seq *s)
{
    return s->last==0;
}
//判断是否已满
bool seq_Full(struct seq *s)
{
    return s->last==s->cap;
}

//查找位置
int seq_find(struct seq *s,int data)
{
    if (seq_Empty(s))
    {
        printf("seq is empty\n");
        return -1;
    }
    for (int i = 0; i < s->last; i++)
    {
        if (s->data[i]=data)
        {
            return i;
        }
    }
}
//末尾插入数据
void seq_tail(struct seq *s,int data)
{
    if (seq_Full(s))
    {
        printf("seq is full\n");
        return;
    }
    s->data[s->last]=data;
    s->last++;
}
//开头插入数据
void seq_head(struct seq *s,int data)
{
    if (seq_Full(s))
    {
        printf("seq is full\n");
        return;
    }
    s->data[0]=data;
    s->last++;
}
//在指定位置插入数据
void seq_middil(struct seq *s,int data)
{
    int index;
    for (int i = 0; i < s->last; i++)
    {
        if (s->data[i]>data)
        {
            index=i;
            break;
        }
        else
        {
            index=i+1;
            continue;
        }
    }
    for (int i = s->last; i >= index  ; i--)
    {    
        s->data[i+1] = s->data[i];
    }
    
    s->last++;
    s->data[index] = data;
}

//遍历顺序表
void seq_show(struct seq *s)
{
    if(seq_Empty(s))
    {
        printf("Sequence is empty!\n");
        return;
    }

    printf("Sequence list data is:");
    for (int i = 0; i <= s->last; i++)
    {
        printf("%d ", s->data[i]);
    }
    printf("\n"); 
}

// 移除节点
bool remove_sequenceList(struct seq *s, int index)
{
    if(index != -1)
    {  
        // 后面的数据要向前移动
        while (1)
        {
            if(index == s->last)
            {
                s->data[index]=0;
                s->last--;
                break;
            }
            s->data[index] = s->data[index+1];
            index++;
            
        }

        return true;
    }

    return false;
}

4.销毁顺序表:

复制代码
//销毁顺序表
void seq_destroy(struct seq *s)
{
    if (s==NULL)
        return;
    free(s->data);
    free(s);
}

示例代码:

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

struct seq
{
    int cap;
    int last;
    int *data;
};
//初始化顺序数据表
struct seq *init_callloc(int cap)
{
    struct seq *p=calloc(1,sizeof(struct seq));
    if (p!=NULL)
    {
        p->cap=cap;
        p->last=0;
        p->data=calloc(1,sizeof (int)*cap);
        if (p->data!=NULL)
            return p;
        else
            free(p); 
    }
}

//判断是否为空
bool seq_Empty(struct seq *s)
{
    return s->last==0;
}
//判断是否已满
bool seq_Full(struct seq *s)
{
    return s->last==s->cap;
}

//查找位置
int seq_find(struct seq *s,int data)
{
    if (seq_Empty(s))
    {
        printf("seq is empty\n");
        return -1;
    }
    for (int i = 0; i < s->last; i++)
    {
        if (s->data[i]=data)
        {
            return i;
        }
    }
}
//末尾插入数据
void seq_tail(struct seq *s,int data)
{
    if (seq_Full(s))
    {
        printf("seq is full\n");
        return;
    }
    s->data[s->last]=data;
    s->last++;
}
//开头插入数据
void seq_head(struct seq *s,int data)
{
    if (seq_Full(s))
    {
        printf("seq is full\n");
        return;
    }
    s->data[0]=data;
    s->last++;
}
//在指定位置插入数据
void seq_middil(struct seq *s,int data)
{
    int index;
    for (int i = 0; i < s->last; i++)
    {
        if (s->data[i]>data)
        {
            index=i;
            break;
        }
        else
        {
            index=i+1;
            continue;
        }
    }
    for (int i = s->last; i >= index  ; i--)
    {    
        s->data[i+1] = s->data[i];
    }
    
    s->last++;
    s->data[index] = data;
}

//遍历顺序表
void seq_show(struct seq *s)
{
    if(seq_Empty(s))
    {
        printf("Sequence is empty!\n");
        return;
    }

    printf("Sequence list data is:");
    for (int i = 0; i <= s->last; i++)
    {
        printf("%d ", s->data[i]);
    }
    printf("\n"); 
}

//销毁顺序表
void seq_destroy(struct seq *s)
{
    if (s==NULL)
        return;
    free(s->data);
    free(s);
}

// 移除节点
bool remove_sequenceList(struct seq *s, int index)
{
    if(index != -1)
    {  
        // 后面的数据要向前移动
        while (1)
        {
            if(index == s->last)
            {
                s->data[index]=0;
                s->last--;
                break;
            }
            s->data[index] = s->data[index+1];
            index++;
            
        }

        return true;
    }

    return false;
}
int main(int argc,char *argv[])
{
    int cap;
    printf("请输入需要的内存:");
    scanf("%d",&cap);
    struct seq *s=init_callloc(cap);
    int data;
    while(1)
    {
        printf("请输入[正整数为插入,负数为删减]:");
        scanf("%d",&data);
        if (data>0)
        {
            if (seq_Empty(s))
            {
                seq_tail(s,data);
            }
            else if(seq_Full(s))
            {
                printf("seq is full\n");
                continue;
            }
            else
            {
                seq_middil(s,data);
            }
        }
        else
        {
            int index = seq_find(s, -data);
            remove_sequenceList(s, index);
        }
        seq_show(s); 
    }
    seq_destroy(s);
    return 0;
}
相关推荐
虾球xz31 分钟前
游戏引擎学习第215天
网络·学习·游戏引擎
想做富婆1 小时前
python入门:简单介绍和python和pycharm软件安装/学习网址/pycharm设置(改成中文界面,主题,新建文件)
python·学习·pycharm
阿斌_bingyu7092 小时前
Arduino开发物联网ESP32快速入门指南(包含开发语言说明、学习路径和实战教程)
开发语言·物联网·学习
NULL指向我3 小时前
TMS320F28P550SJ9学习笔记14:EPWM_死区dead_baund
笔记·学习
傍晚冰川3 小时前
【STM32】解读启动文件startup_stm32f10x_md.s
linux·笔记·stm32·单片机·学习
zhuyixiangyyds4 小时前
day26图像处理OpenCV
笔记·opencv·学习
虾球xz4 小时前
游戏引擎学习第197天
java·学习·游戏引擎
Acxymy4 小时前
SQL学习笔记七
笔记·sql·学习
虾球xz5 小时前
游戏引擎学习第214天
学习·游戏引擎
傻欣7 小时前
第八天 开始Unity Shader的学习之Blinn-Phong光照模型
学习·unity·游戏引擎