数据结构的顺序表的学习

**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;
}
相关推荐
Hello_Embed17 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中18 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Magnetic_h19 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
研梦非凡19 小时前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
limengshi13839220 小时前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习
知识分享小能手21 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
周周记笔记1 天前
学习笔记:第一个Python程序
笔记·学习
优雅鹅1 天前
ARM、AArch64、amd64、x86_64、x86有什么区别?
arm开发·学习
..过云雨1 天前
05.【Linux系统编程】进程(冯诺依曼体系结构、进程概念、进程状态(注意僵尸和孤儿)、进程优先级、进程切换和调度)
linux·笔记·学习
咸甜适中1 天前
rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片
笔记·学习·rust·egui