数据结构的顺序表的学习

**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;
}
相关推荐
西峰u5 分钟前
Java IO 完整学习笔记|字节流、字符流、缓冲流、资源关闭全梳理
java·笔记·学习
星恒随风16 分钟前
C++11详解(一):统一初始化——列表初始化与 initializer_list
c++·笔记·学习·list·状态模式
我爱cope26 分钟前
【计算机网络 | 网络层补充:内部网关协议:RIP 与 OSPF 如何在自治系统内选择路由?】
网络·学习·计算机网络·智能路由器
是隼人33 分钟前
buuctf-pwn ciscn_2019_n_5题解(学习过程持续 更新)
c语言·学习·安全·pwn入门·ctf入门
旖旎夜光1 小时前
【AI入门】大模型介绍全解析:从模型、LLM 到提示词与嵌入
人工智能·笔记·python·学习·ai编程
xxwl5851 小时前
Git常用命令的学习
git·学习
具身AGI1 小时前
从演示到作业,物理AI 人类学习路线 的深意
人工智能·学习
MSTcheng.1 小时前
【Linux】Linux学习第三弹——Linux基本指令2
linux·windows·学习·ubuntu·操作系统
tju新生代魔迷1 小时前
Verilog HDL学习笔记(三)| 第3章 基本概念(上)——词法约定与数据类型
笔记·学习
tju新生代魔迷2 小时前
Verilog HDL 学习笔记(九)| 第 9 章 实用建模技术
笔记·学习