数据结构的顺序表的学习

**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;
}
相关推荐
剑走偏锋o.O1 小时前
Spring MVC 框架学习笔记:从入门到精通的实战指南
学习·spring·springmvc
sealaugh322 小时前
aws(学习笔记第二十九课) aws cloudfront hands on
笔记·学习·aws
虾球xz2 小时前
游戏引擎学习第117天
学习·游戏引擎
StickToForever2 小时前
第4章 信息系统架构(三)
经验分享·笔记·学习·职场和发展
陈无左耳、4 小时前
HarmonyOS学习第4天: DevEco Studio初体验
学习·华为·harmonyos
挣扎与觉醒中的技术人4 小时前
网络安全入门持续学习与进阶路径(一)
网络·c++·学习·程序人生·安全·web安全
技术小齐5 小时前
网络运维学习笔记 017HCIA-Datacom综合实验01
运维·网络·学习
曾浩轩5 小时前
51单片机学习之旅——C语言小知识
c语言·学习·51单片机
宇寒风暖6 小时前
侯捷 C++ 课程学习笔记:内存管理与工具应用
c++·笔记·学习
Alidme7 小时前
cs106x-lecture14(Autumn 2017)-SPL实现
c++·学习·算法·codestepbystep·cs106x