当前位置: 首页 > news >正文

数据结构的顺序表的学习

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;elsefree(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;elsefree(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;
}


http://www.mrgr.cn/news/9022.html

相关文章:

  • Ai+若依(系统接口--Swagger):04篇
  • 回零及编码器
  • 斗破C++编程入门系列之十六:C++程序设计必知:类的静态成员(九星斗者)彩蛋
  • 哈希环算法(C语言版本)
  • selenium-java实现自动登录跳转页面
  • 【日记】狗尾巴草与暗恋(1519 字)
  • java调用阿里大模型服务平台百炼
  • 【吊打面试官系列-Memcached面试题】什么是二进制协议,我该关注吗?
  • 字符函数内存函数———C语言
  • js 数组使用 map 结构渲染个性字段
  • SpringBoot整合MQ
  • uniapp - plugins的组件配置使用
  • 数字身份革命:探索Web3对个人隐私的保护
  • 打卡52天------图论(应用题)
  • 网络协议的基础知识
  • 深入理解Elasticsearch:让搜索性能飞起来!
  • Leetcode 3267. Count Almost Equal Pairs II
  • AI人像换脸!Reactor插件本地部署方法(含报错解决及整合包)
  • 微信大于1G文件转输不了的解决方案
  • 9、Flink SQL 流式概念之Compiled Plan详解