数据结构的顺序表的学习

**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;
}
相关推荐
潜心一志3 小时前
HALCON软件——基本架构,算子参数
学习·计算机视觉
爱吃苹果的日记本4 小时前
数据结构第三课(时间复杂度)
数据结构·学习
泡泡鱼(敲代码中)7 小时前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql
fanged8 小时前
Agent的Skills(TODO)
学习
是隼人8 小时前
buuctf-pwn picoctf_2018_shellcode(ret2shellcode)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
m4Rk_9 小时前
【论文阅读】Agent 记忆机制(69):STITCH——用上下文意图解决“语义相关但情境错误”的记忆检索
论文阅读·人工智能·学习·开源·github
2601_949950639 小时前
个人在线刷题的工具
学习·考研·小程序·刷题·小程序推荐
一尘之中9 小时前
深入解析面向服务的架构(SOA):从特性到实施
学习·架构·ai写作
秦哈哈11 小时前
【Hello Agents】学习笔记(二)
笔记·学习·microsoft
sunshine22 girl11 小时前
Java学习三 高级语法3, 方法
java·学习