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

宿迁58同城租房网排名优化公司口碑哪家好

宿迁58同城租房网,排名优化公司口碑哪家好,做响应式网站的公司,网站建设服务器百度云目录 【本节目标】1. 线性表2.顺序表2.1概念及结构2.2 接口实现2.2.0 动态顺序表2.2.1 顺序表初始化SLInit()2.2.2 销毁和打印2.2.3 尾插SLPushBack()2.2.4 尾删SLPopBack()2.2.5 头插2.2.6 头删2.2.7 插入…

目录

  • 【本节目标】
  • 1. 线性表
  • 2.顺序表
    • 2.1概念及结构
    • 2.2 接口实现
      • 2.2.0 动态顺序表
      • 2.2.1 顺序表初始化SLInit()
      • 2.2.2 销毁和打印
      • 2.2.3 尾插SLPushBack()
      • 2.2.4 尾删SLPopBack()
      • 2.2.5 头插
      • 2.2.6 头删
      • 2.2.7 插入
      • 2.2.8 删除
      • 2.2.9 查找函数
    • 2.3 源代码
      • 2.3.1 SeqList20250226.h
      • 2.3.2 SeqList20250226.c
      • 2.3.3 FileName20250226.c

【本节目标】

1.线性表
2.顺序表
3.链表
4.顺序表和链表的区别和联系

1. 线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储

2.顺序表

2.1概念及结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素。
    在这里插入图片描述

  2. 动态顺序表:使用动态开辟的数组存储。

在这里插入图片描述

2.2 接口实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。

2.2.0 动态顺序表

//seqList.h
#pragma once
#include<stdio.h>
typedef int SLDataType;
#define INIT_CAPACITY 4 //默认初始化大小
//动态顺序表——按需申请
typedef struct SeqList
{SLDataType* a;int size; //有效数据个数int capacity;//空间容量
}SL;

2.2.1 顺序表初始化SLInit()

版本1

//seqList.c
#include"SeqList20250226.h"
//顺序表初始化1
void seqInit(SL s)
{s.a = (SLDataType*)malloc(sizeof(SLDataType)* INIT_CAPACITY);if (s.a == NULL){perror("seqInit");return;}s.size = 0;s.capacity = INIT_CAPACITY;
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList20250226.h"SL s;
void TestSeqList1(SL s)
{seqInit(s);
}
int main()
{TestSeqList1(s);return 0;
}

初始化结果:单步调试在这里插入图片描述

版本2(后续都使用版本2)

//顺序表初始化2
void SLInit(SL* ps)
{ps->a = ((SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY));if (ps->a == NULL){perror("SLInit");return;}ps->size = 0;ps->capacity = INIT_CAPACITY;
}

2.2.2 销毁和打印

//seqList.h
//销毁
void SLDestroy(SL* ps);
//打印
void SLPrint(SL* ps);
//seqList.c
//销毁
void SLDestroy(SL* ps)
{free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}
//打印
void SLPrint(SL* ps)
{int i = 0;for (i = 0; i < ps->size; i++){printf("%d", ps->a[i]);}printf("\n");
}

2.2.3 尾插SLPushBack()

seqList.h

#include<stdlib.h>
//尾插
void SLPushBack(SL* ps, SLDataType x);

seqList.c


//尾插
void SLPushBack(SL* ps, SLDataType x)
{
//扩容 这里扩容了2倍,是自己定的,是一个比较合理的值,具体需要开辟多大是要和自己的实际问题结合if (ps->size == ps->capacity){SLDataType* tem = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * ((ps->capacity) * 2));if (tem == NULL){perror("SLPushBack::realloc");return;}ps->a = tem;ps->capacity *= 2;}//ps->a[ps->size] = x;//ps->size++;  这两行可以合并为下面的1行ps->a[ps->size++] = x;
}

尾插验证

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList20250226.h"
void TestSeqList1()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPushBack(&s, 6);SLPushBack(&s, 7);SLPushBack(&s, 8);SLPushBack(&s, 9);SLPrint(&s);
}int main()
{TestSeqList1();return 0;
}

在这里插入图片描述

2.2.4 尾删SLPopBack()

//尾删
void SLPopBack(SL* ps)
{assert(ps);//判断是否为空if (ps->size == 0){return 0;}//不为空就直接size-1ps->size--;
}

验证插入4个元素,删掉1个元素
在这里插入图片描述

2.2.5 头插

头插思路
在这里插入图片描述

扩容函数封装

void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity)//判断目前是大小是否和容量大小一样,一样的话,就需要扩容{SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * (ps->capacity) * 2); //扩容原来容量的两倍if (tmp == NULL){perror("SLCheckCapacity::realloc fail!"); return;}ps->a = tmp;ps->capacity *= 2;}
}

代码实现

void SLPushFront(SL* ps, SLDataType x)
{assert(ps);//这里要考虑扩容的事情,所以我们需要封装一个扩容函数,SLCheckCapacity(ps);int end =ps->size-1;while (end>=0){ps->a[end+1] = ps->a[end ];//从后往前依次向后挪end--;}ps->a[0] = x;ps->size++;
}

头插验证
在这里插入图片描述

2.2.6 头删

思路
在这里插入图片描述

void SLPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);//size小于0 直接断言报错。int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;}

头删验证
在这里插入图片描述

2.2.7 插入

思路
在这里插入图片描述

void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size - 1;while (pos < end){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}

验证
在这里插入图片描述

2.2.8 删除

思路
在这里插入图片描述

void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int begin = pos + 1;while (begin <ps->size){ps->a[begin-1] = ps->a[begin];begin++;}ps->size--;
}

验证
在这里插入图片描述

2.2.9 查找函数

思路:比较简单,直接遍历即可

int SLFind(SL* ps, SLDataType x)//直接遍历即可
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){printf("找到了");return i;}}return -1;
}

2.3 源代码

2.3.1 SeqList20250226.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//#define N 100
//typedef int SLDataType;
// 静态顺序表 -- 开少了不够用 开多了浪费
//struct SeqList
//{
//	SLDataType a[N];
//	int sise;
//};typedef int SLDataType;
#define INIT_CAPACITY 4 //默认初始化大小
//动态顺序表——按需申请
typedef struct SeqList
{SLDataType* a;int size; //有效数据个数int capacity;//空间容量
}SL;//基础的增删查改函数//初始化
void seqInit(SL* ps);
void SLInit(SL* ps);
//销毁
void SLDestroy(SL* ps);
//打印
void SLPrint(SL* ps);//尾插
void SLPushBack(SL* ps, SLDataType x);
//尾删
void SLPopBack(SL* ps);
头插
void SLPushFront(SL* ps, SLDataType x);
头删
void SLPopFront(SL* ps);// 顺序表在pos位置插入x
void SLInsert(SL* ps, int pos, SLDataType x);// 顺序表删除pos位置的值
void SLErase(SL* ps, int pos);//查找表中有没有某个值
int SLFind(SL* ps, SLDataType x);

2.3.2 SeqList20250226.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList20250226.h"//顺序表初始化1
void seqInit(SL s)
{s.a = (SLDataType*)malloc(sizeof(SLDataType)* INIT_CAPACITY);if (s.a == NULL){perror("seqInit");return;}s.size = 0;s.capacity = INIT_CAPACITY;
}
//顺序表初始化2
void SLInit(SL* ps)
{ps->a = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);if (ps->a == NULL){perror("SLInit");return;}ps->size = 0;ps->capacity = INIT_CAPACITY;
}//销毁
void SLDestroy(SL* ps)
{free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}
//打印
void SLPrint(SL* ps)
{int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}//尾插
void SLPushBack(SL* ps, SLDataType x)
{//判断是否要扩容if (ps->size == ps->capacity){SLDataType* tem = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * (ps->capacity) * 2);if (tem == NULL){perror("SLPushBack::realloc  fail");return;}ps->a = tem;ps->capacity *= 2;}//ps->a[ps->size] = x;//ps->size++;  //这两行可以合并为下面的1行ps->a[ps->size++] = x;
}//尾删
void SLPopBack(SL* ps)
{assert(ps);//判断是否为空if (ps->size == 0){return 0;}//不为空就直接size-1ps->size--;
}void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * (ps->capacity) * 2);if (tmp == NULL){perror("SLCheckCapacity::realloc fail!"); return;}ps->a = tmp;ps->capacity *= 2;}
}void SLPushFront(SL* ps, SLDataType x)
{assert(ps);//这里要考虑扩容的事情,所以我们需要封装一个扩容函数,SLCheckCapacity(ps);int end =ps->size-1;while (end>=0){ps->a[end+1] = ps->a[end ];//从后往前依次向后挪end--;}ps->a[0] = x;ps->size++;
}void SLPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);//size小于0 直接断言报错。int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;}void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);SLCheckCapacity(ps);int end = ps->size - 1;while (pos <= end){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int begin = pos + 1;while (begin <ps->size){ps->a[begin-1] = ps->a[begin];begin++;}ps->size--;
}int SLFind(SL* ps, SLDataType x)//直接遍历即可
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){printf("找到了");return i;}}return -1;
}

2.3.3 FileName20250226.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList20250226.h"void TestSeqList1()
{SL s;SLInit(&s);SLPushBack(&s, 0);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);
//	SLPopBack(&s);
// 
//	SLPushFront(&s,5);
//  SLPopFront(&s);//	SLInsert(&s, 2, 20);SLErase(&s, 2);SLPrint(&s);SLDestroy(&s);
}void manu()
{printf("**************************\n");printf("****1:头插      2.尾插****\n");printf("****3.头删      4.尾删****\n");printf("****5.插入      -1.退出****\n");printf("**************************\n");
}int main()
{SL s;SLInit(&s);int input = 0;while (input != -1){manu();scanf("%d", &input);printf("请输入您的选择:\n");if (input == 1){printf("请输入您想要插入的数据,并以-1结尾\n");int x = 0;while (x != -1){scanf("%d", &x);SLPushBack(&s, x);}}else if (input == 7){SLPrint(&s);}}//TestSeqList1();return 0;
}

在这里插入图片描述

http://www.dtcms.com/wzjs/121754.html

相关文章:

  • 定制企业网站开发公司扬州网站推广公司
  • 如何查看一个网站的域名解析北京seo网站优化培训
  • wordpress增加标签页网站优化方案怎么写
  • 不同网站相似的页面百度收录吗百度搜图入口
  • 网站租金可以做办公费吗线上招生引流推广方法
  • 开发网站开票名称是什么网站推广的100种方法
  • 泽成seo网站排名推广策略
  • 湖南省建设工程造价总站网站app怎么开发出来的
  • 开店装修话做那个网站找工人广东公司搜索seo哪家强
  • 网站后台流程图网页设计制作网站素材
  • 怎么查询一个网站有没有做竞价济南seo网站优化
  • 粮食局网站建设方案女生学网络营销这个专业好吗
  • 简要描述网站建设的基本步骤最新中高风险地区名单
  • 一起做网站女装夏季搜狗搜索排名优化
  • 专门做照片的网站百度统计手机app
  • 做微网站 主机 域名北京广告公司
  • 公司想做网站费用要多少钱优化营商环境应当坚持什么原则
  • 北京做冷冻牛羊肉的网站拼多多代运营一般多少钱
  • 政府网站建设文案营销型企业网站的功能
  • 辽宁建设厅网站什么时候换的网店运营工资一般多少
  • 南宁网站建设seoapp注册推广任务平台
  • 梅州网站建设公司seo推广什么意思
  • wordpress幻灯片的调用代码引擎优化seo是什么
  • 铜陵做网站想找搜索引擎优化
  • 如何把自己做的网站 放在网上seo推广是做什么
  • 网站制作推广需要多少钱国外搜索网站排名
  • 有哪些企业会找人做网站建设东莞网站推广策划
  • 毕业设计博客网站开发app推广30元一单
  • 专门做奢侈品的网站有哪些网络营销环境分析
  • moodle做网站百度推广要自己建站吗