<数据结构> 顺序表

2023-05-16

目录

一、顺序表介绍

二、准备工作

       1、创建顺序表

       2、初始化顺序表

       3、检测是否需要扩容

       4、销毁顺序表

       5、打印顺序表

三、四大功能

       1、增加数据

                    头插

                    尾插

                    指定下标插入

       2、删除数据

                    头删

                    尾删

                    指定下标删除

       3、查找数据

       4、修改数据

四、总代码

       1、SeqList.h

       2、SeqList.c

       3、Test.c


一、顺序表介绍

  • 概念及结构

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

顺序表一般可以分为:

1. 静态顺序表:使用定长数组存储元素。

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

  • 要求:

顺序表要求存储的数据是从0开始,依次连续存储,中间不能有空的。

  • 接口实现

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

  • 注:

本文将创建SeqList.h、SeqList.c、Test.c三个文件夹,分别用于声明,定义,具体实现

正文开始:

二、准备工作

1、创建顺序表

  • SeqList.h文件:
//创建顺序表
typedef int SLDataType; //确保以后想存其它类型的时候方便改动,本文以存放整型数据为例
typedef struct SeqList
{
	SLDataType* a; //动态开辟数组
	int size;    //存储顺序表中有效数据个数
	int capacity;//存储空间个数-->记录最大容量 
}SeqList; 

2、初始化顺序表

  • SeqList.h文件:
//初始化顺序表
void SeqListInit(SeqList* psl);
  • SeqList.c文件:
//初始化通讯录
void SeqListInit(SeqList* psl)
{
	assert(psl);
	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;
}

3、检测是否需要扩容

  • SeqList.h文件:
//检测是否需要扩容
void SeqListCheckCapacity(SeqList* psl);
  • SeqList.c文件:
//检测是否需要扩容
void SeqListCheckCapacity(SeqList* psl)
{
	assert(psl);
	//如果满了,就要扩容
	if (psl->size == psl->capacity)
	{
		size_t newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2; //防止原始capacity的容量本身为0,导致后续扩容仍为0
		SLDataType* tmp = realloc(psl->a, sizeof(SLDataType) * newCapacity);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		else
		{
			psl->a = tmp;
			psl->capacity = (int)newCapacity;
		}
	}
}
  • 注意:

当realloc的指针为空时,此时realloc就相当于malloc

4、销毁顺序表

  • SeqList.h文件:
//销毁顺序表
void SeqListDestroy(SeqList* psl);
  • SeqList.c文件:
//销毁顺序表
void SeqListDestroy(SeqList* psl)
{
	assert(psl);
	free(psl->a);
	psl->a = NULL;
	psl->capacity = psl->size = 0;
}

5、打印顺序表

  • 思想:

只需for循环依次打印即可

  • SeqList.h文件:
//打印顺序表
void SeqListPrint(SeqList* psl);
  • SeqList.c文件:
//打印顺序表
void SeqListPrint(SeqList* psl)
{
	assert(psl);
	for (int i = 0; i < psl->size; i++)
	{
		printf("%d ",psl->a[i]);
	}
	printf("\n");
}

三、四大功能

1、增加数据

头插

  • 思想:

比尾插稍微复杂一点,头插就是把最后一个数字往后挪,再把前一个数字往后挪,以此类推,直到把第一个位置给它空出来,但是前提是得确保空间足够,不够就得扩容

  • SeqList.h文件:
//头插
void SeqListPushFront(SeqList* psl, SLDataType x);
  • SeqList.c文件:
//头插
void SeqListPushFront(SeqList* psl, SLDataType x)
{
	assert(psl);
	SeqListCheckCapacity(psl); //检测容量
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		end--;
	}
	psl->a[0] = x;
	psl->size++;
}
  • Test.c文件:
int main()
{
	SeqList s;
	SeqListInit(&s); //一定要加上&,因为形参的改变不会影响实参,要传地址
	//先尾插4个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPrint(&s); //尾插4次后打印
	//头插2个数字
	SeqListPushFront(&s, 0);
	SeqListPushFront(&s, -1);
	SeqListPrint(&s); //头插2次后打印
	return 0;
}
  • 效果如下:

尾插

  • 思想:

其实数组a的下标size就是最后一个数据的下一个位置,尾插只需要在ps->size处插入一个数据即可,不过前提是要先检查容量是否满

  • SeqList.h文件:
//尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
  • SeqList.c文件:
//尾插
void SeqListPushBack(SeqList* psl, SLDataType x)
{
	assert(psl);
	SeqListCheckCapacity(psl); //检测容量
	psl->a[psl->size] = x;
	psl->size++;
}
  • Test.c文件:
int main()
{
	SeqList s;
	SeqListInit(&s); //一定要加上&,因为形参的改变不会影响实参,要传地址
	//尾插5个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 5);
	SeqListPrint(&s); //打印
	return 0;
}
  • 效果如下:

指定下标插入

  • 思想:

其实指定位置插入的思想同上文的尾插是很相似的,但是要确保这个指定插入的位置在有效数据size范围内,不然就会出现越界,就不是顺序表了,

  • SeqList.h文件:
//在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
  • SeqList.c文件:
//在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{
	assert(psl);
	//暴力检查
	/*assert(pos <= psl->size && psl);*/
	//温和检查
	if (pos > psl->size)
	{
		printf("pos 越界:%d\n", (int)pos);
		return;
	}
	SeqListCheckCapacity(psl); //检测容量
	int end = psl->size - 1;
	while (end >= (int)pos)
	{
		psl->a[end + 1] = psl->a[end];
		end--;
	}
	psl->a[pos] = x;
	psl->size++;
}
  • Test.c文件:
int main()
{
	SeqList s;
	SeqListInit(&s);
	//先尾插4个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPrint(&s); //尾插4次后打印
	//指定下标插入2个数字
	SeqListInsert(&s, 10, 100);
	SeqListInsert(&s, 1, 20);
	SeqListPrint(&s); //插入成功后打印
	SeqListDestroy(&s);
	return 0;
}
  • 效果如下:

  • 注意:

当我们实现完指定下标插入时,我们发现当pos=size时,实现的就是尾插

//尾插
void SeqListPushBack(SeqList* psl, SLDataType x)
{
	assert(psl);
//法一:
	/*SeqListCheckCapacity(psl); //检测容量
	psl->a[psl->size] = x;
	psl->size++;*/
//法二:
	SeqListInsert(psl, psl->size, x);
}

类似的,当pos=0时,实现的就是头插,如下:

//头插
void SeqListPushFront(SeqList* psl, SLDataType x)
{
	assert(psl);
//法一:
	/*SeqListCheckCapacity(psl); //检测容量
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		end--;
	}
	psl->a[0] = x;
	psl->size++;*/
//法二:
	SeqListInsert(psl, 0, x);
}

2、删除数据

头删

  • 思想:

头删不需要考虑扩容,头删需要把第二个数字往前挪,再把下一个数字往前挪,以此类推,注意,再删数据时要确保有效数据size恒>=0,以保证后续能够正常加数据。

  • SeqList.h文件:
//头删
void SeqListPopFront(SeqList* psl);
  • SeqList.c文件:
//头删
void SeqListPopFront(SeqList* psl)
{
	assert(psl);
	if (psl->size > 0)
	{
		int begin = 1;
		while (begin < psl->size)
		{
			psl->a[begin - 1] = psl->a[begin];
			begin++;
		}
		psl->size--;
	}
}
  • Test.c文件:
int main()
{
	SeqList s;
	SeqListInit(&s);
	//尾插10个数字
	for (int i = 1; i <= 10; i++)
	{
		SeqListPushBack(&s, i);
	}
	SeqListPrint(&s); //尾插10个数字后打印
	//头删12次数据
	for (int i = 1; i <= 12; i++)
	{
		SeqListPopFront(&s);
	}
	SeqListPrint(&s); //头删12次后打印
	//头插5个数字
	for (int i = -5; i <= -1; i++)
	{
		SeqListPushFront(&s, i);
	}
	SeqListPrint(&s); //头插5次后打印
	return 0;
}
  • 效果如下:

尾删

  • 思想:

这里size就是统计开辟的数组中有效数据的个数,只需要把有效数据的个数-1,打印的时候自然会把原本最后一个数据给删掉,但是要注意,如果删除次数过多,有效数据size可能会变成负的,为了避免这一现象,只需要确保在size>0时再减减即可,同样为了防止传入空指针,只需要assert断言即可。

  • SeqList.h文件:
//尾删
void SeqListPopBack(SeqList* psl);
  • SeqList.c文件:
//尾删
void SeqListPopBack(SeqList* psl)
{
	assert(psl);
	if (psl->size > 0)
	{
		psl->size--;
	}
}
  • Test.c文件:
int main()
{
	SeqList s;
	SeqListInit(&s); //一定要加上&,因为形参的改变不会影响实参,要传地址
	//尾插5个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 5);
	SeqListPrint(&s); //尾插5次后打印

	//尾删6个数字
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPrint(&s); //尾删6次后打印

	//再尾插2个数字
	SeqListPushBack(&s, 6);
	SeqListPushBack(&s, 7);
	SeqListPrint(&s); //再尾插2次打印
	return 0;
}
  • 效果如下:

指定下标删除

  • 思想:

其实思想并不复杂,首先要断言不是空指针,其次要确保下标pos<size,不能=size,因为下标size的值是空的,并非有效数据,若=size则删除一个无意义的数,接下来就跟头删类似了,把pos后一个位置挪到前一个,再换下一个,依次类推

  • SeqList.h文件:
//删除pos位置的数据
void SeqListErase(SeqList* psl, size_t pos);
  • SeqList.c文件:
//删除pos位置的数据
void SeqListErase(SeqList* psl, size_t pos)
{
	assert(psl);
	assert(pos < psl->size);
	size_t begin = pos + 1;
	while (begin < psl->size)
	{
		psl->a[begin - 1] = psl->a[begin];
		++begin;
	}
	psl->size--;
}
  • Test.c文件:
int main()
{
	SeqList s;
	SeqListInit(&s);
	//先尾插4个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPrint(&s); //尾插4次后打印
	//删除2个指定下标的数字
	SeqListErase(&s, 3);//下标3
	SeqListErase(&s, 1);//下标1
	SeqListPrint(&s); //删除后打印
	return 0;
}
  • 效果如下:

  •  注意:

当pos=size-1时,删除的就是最后一个数字,实现的就是尾删,所以尾删可以这样写:

//尾删
void SeqListPopBack(SeqList* psl)
{
	assert(psl);
	/*if (psl->size > 0)
	{
		psl->size--;
	}*/
	SeqListErase(psl, psl->size - 1);
}

当pos=0时,删除的就是第一个数字,实现的就是头删,所以头删也可以这样解决

//头删
void SeqListPopFront(SeqList* psl)
{
	assert(psl);
//法一:
	/*if (psl->size > 0)
	{
		int begin = 1;
		while (begin < psl->size)
		{
			psl->a[begin - 1] = psl->a[begin];
			begin++;
		}
		psl->size--;
	}*/
//法二:指定下标删除法
	SeqListErase(psl, 0);
}

3、查找数据

  • 思想:

遍历数组即可。

  • SeqList.h文件:
//查找指定数字
int SeqListFind(SeqList* psl, SLDataType x);
  • SeqList.c文件:
//查找指定数字
int SeqListFind(SeqList* psl, SLDataType x)
{
	assert(psl);
	for (int i = 0; i < psl->size; i++)
	{
		if (psl->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}
  • Test.c文件:
int main()
{
	SeqList s;
	SeqListInit(&s);
	//先尾插4个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPrint(&s); //尾插4次后打印
	int pos = SeqListFind(&s, 3);
	if (pos != -1)
		printf("找到了,下标是:%d", pos);
	else
		printf("找不到\n");
	return 0;
}
  • 效果如下:

4、修改数据

  • 思想:

只需要把指定下标的数字进行修改即可,前提是修改的数字是有效数据

  • SeqList.h文件:
//修改指定下标数字
void SeqListModify(SeqList* psl, size_t pos, SLDataType x);
  • SeqList.c文件:
//修改指定下标数字
void SeqListModify(SeqList* psl, size_t pos, SLDataType x)
{
	assert(psl);
	assert(pos < psl->size);
	psl->a[pos] = x;
}
  • Test.c文件:
int main()
{
	SeqList s;
	SeqListInit(&s);
	//先尾插4个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPrint(&s); //尾插4次后打印
	SeqListModify(&s, 1, 5);
	SeqListPrint(&s); //修改后打印
	int pos = SeqListFind(&s, 3);
	if (pos != -1)
	{
		SeqListModify(&s, pos, 5000);
		SeqListPrint(&s); //查找再修改后打印
	}
	return 0;
}
  • 效果如下:

四、总代码

1、SeqList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//创建顺序表
typedef int SLDataType; //确保以后想存其它类型的时候方便改动,本文以存放整型数据为例
typedef struct SeqList
{
	SLDataType* a; //动态开辟数组
	int size;    //存储顺序表中有效数据个数
	int capacity;//存储空间个数-->记录最大容量 
}SeqList;

//初始化顺序表
void SeqListInit(SeqList* psl);
//检测是否需要扩容
void SeqListCheckCapacity(SeqList* psl);
//打印顺序表
void SeqListPrint(SeqList* psl);
//销毁顺序表
void SeqListDestroy(SeqList* psl);

//尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
//尾删
void SeqListPopBack(SeqList* psl);
//头插
void SeqListPushFront(SeqList* psl, SLDataType x);
//头删
void SeqListPopFront(SeqList* psl);
//在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
//删除pos位置的数据
void SeqListErase(SeqList* psl, size_t pos);

//查找指定数字
int SeqListFind(SeqList* psl, SLDataType x);
//修改指定下标数字
void SeqListModify(SeqList* psl, size_t pos, SLDataType x);

2、SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
//初始化通讯录
void SeqListInit(SeqList* psl)
{
	assert(psl);
	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;
}

//检测是否需要扩容
void SeqListCheckCapacity(SeqList* psl)
{
	assert(psl);
	//如果满了,就要扩容
	if (psl->size == psl->capacity)
	{
		size_t newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2; //防止原始capacity的容量本身为0,导致后续扩容仍为0
		SLDataType* tmp = realloc(psl->a, sizeof(SLDataType) * newCapacity);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		else
		{
			psl->a = tmp;
			psl->capacity = (int)newCapacity;
		}
	}
}

//打印顺序表
void SeqListPrint(SeqList* psl)
{
	assert(psl);
	for (int i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}
//销毁顺序表
void SeqListDestroy(SeqList* psl)
{
	assert(psl);
	free(psl->a);
	psl->a = NULL;
	psl->capacity = psl->size = 0;
}

//尾插
void SeqListPushBack(SeqList* psl, SLDataType x)
{
	assert(psl);
	//法一:
		/*SeqListCheckCapacity(psl); //检测容量
		psl->a[psl->size] = x;
		psl->size++;*/
	//法二:指定下标插入
	SeqListInsert(psl, psl->size, x);
}
//尾删
void SeqListPopBack(SeqList* psl)
{
	assert(psl);
	/*if (psl->size > 0)
	{
		psl->size--;
	}*/
	SeqListErase(psl, psl->size - 1);
}

//头插
void SeqListPushFront(SeqList* psl, SLDataType x)
{
	assert(psl);
//法一:
	/*SeqListCheckCapacity(psl); //检测容量
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		end--;
	}
	psl->a[0] = x;
	psl->size++;*/
//法二:指定下标插入法
	SeqListInsert(psl, 0, x);
}
//头删
void SeqListPopFront(SeqList* psl)
{
	assert(psl);
//法一:
	/*if (psl->size > 0)
	{
		int begin = 1;
		while (begin < psl->size)
		{
			psl->a[begin - 1] = psl->a[begin];
			begin++;
		}
		psl->size--;
	}*/
//法二:指定下标删除法
	SeqListErase(psl, 0);
}

//在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{
	assert(psl);
	//暴力检查
	/*assert(pos <= psl->size && psl);*/
	//温和检查
	if (pos > psl->size)
	{
		printf("pos 越界:%d\n", (int)pos);
		return;
	}
	SeqListCheckCapacity(psl); //检测容量
	int end = psl->size - 1;
	while (end >= (int)pos)
	{
		psl->a[end + 1] = psl->a[end];
		end--;
	}
	psl->a[pos] = x;
	psl->size++;
}
//删除pos位置的数据
void SeqListErase(SeqList* psl, size_t pos)
{
	assert(psl);
	assert(pos < psl->size);
	size_t begin = pos + 1;
	while (begin < psl->size)
	{
		psl->a[begin - 1] = psl->a[begin];
		++begin;
	}
	psl->size--;
}

//查找指定数字
int SeqListFind(SeqList* psl, SLDataType x)
{
	assert(psl);
	for (int i = 0; i < psl->size; i++)
	{
		if (psl->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}

//修改指定下标数字
void SeqListModify(SeqList* psl, size_t pos, SLDataType x)
{
	assert(psl);
	assert(pos < psl->size);
	psl->a[pos] = x;
}

3、Test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
void test1()
{
	SeqList s;
	SeqListInit(&s); //一定要加上&,因为形参的改变不会影响实参,要传地址
	//尾插5个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 5);
	SeqListPrint(&s); //尾插5次后打印

	//尾删6个数字
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPrint(&s); //尾删6次后打印

	//再尾插2个数字
	SeqListPushBack(&s, 6);
	SeqListPushBack(&s, 7);
	SeqListPrint(&s); //再尾插2次打印
}
void TestSeqList2()
{
	SeqList s;
	SeqListInit(&s); //一定要加上&,因为形参的改变不会影响实参,要传地址
	//先尾插4个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPrint(&s); //尾插4次后打印
	//头插2个数字
	SeqListPushFront(&s, 0);
	SeqListPushFront(&s, -1);
	SeqListPrint(&s); //头插2次后打印
}
void TestSeqList3()
{
	SeqList s;
	SeqListInit(&s);
	//先尾插4个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPrint(&s); //尾插4次后打印
	//头删
	SeqListPopFront(&s);
	SeqListPopFront(&s);
	SeqListPopFront(&s);
	SeqListPopFront(&s);
	SeqListPopFront(&s);
	SeqListPopFront(&s);
	SeqListPrint(&s); //头删6次后打印
	//头插2个数字
	SeqListPushFront(&s, 0);
	SeqListPushFront(&s, -1);
	SeqListPrint(&s); //头插2次后打印
}
void TestSeqList4()
{
	SeqList s;
	SeqListInit(&s);
	//尾插10个数字
	for (int i = 1; i <= 10; i++)
	{
		SeqListPushBack(&s, i);
	}
	SeqListPrint(&s); //尾插10个数字后打印
	//头删12次数据
	for (int i = 1; i <= 12; i++)
	{
		SeqListPopFront(&s);
	}
	SeqListPrint(&s); //头删12次后打印
	//头插5个数字
	for (int i = -5; i <= -1; i++)
	{
		SeqListPushFront(&s, i);
	}
	SeqListPrint(&s); //头插5次后打印
}
void TestSeqList5()
{
	SeqList s;
	SeqListInit(&s);
	//先尾插4个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPrint(&s); //尾插4次后打印
	//指定下标插入2个数字
	SeqListInsert(&s, 10, 100);
	SeqListInsert(&s, 1, 20);
	SeqListInsert(&s, 5, 50);
	SeqListPrint(&s); //指定插入2次后打印
	SeqListDestroy(&s);
}
int main()
{
	SeqList s;
	SeqListInit(&s);
	//先尾插4个数字
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPrint(&s); //尾插4次后打印
	SeqListModify(&s, 1, 5);
	SeqListPrint(&s); //修改后打印
	int pos = SeqListFind(&s, 3);
	if (pos != -1)
	{
		SeqListModify(&s, pos, 5000);
		SeqListPrint(&s); //查找再修改后打印
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

<数据结构> 顺序表 的相关文章

随机推荐

  • echarts 力导向图

    首先放上大佬文章链接 xff1a http blog csdn net u010430471 article details 52955131 https www cnblogs com koala2016 archive 2016 12
  • echarts力导向图区分鼠标点击事件与拖拽事件(angularjs)

    使用echarts的力导向图做了一个知识图谱 xff0c 要求点击节点的时候 xff0c 把节点的数据作为关键词搜索 知识图谱 xff0c 以前没做过 xff0c 也不知道用什么好 xff0c 百度了一下看到有人说用echarts可以做 x
  • 2018前端笔试面试题整理

    最近好几个前端的朋友都在换工作 xff0c 根据她们的面试经验整理了一些前端笔试面试题 毕竟人少 xff0c 面的公司也少 xff0c 所以并不全面 开放性题目 xff1a 1 你在现在的团队处于什么样的角色 xff0c 起到了什么明显的作
  • docker容器网络

    在安装docker时 xff0c 会自动在host主机上创建三个网络 xff0c 用docker network ls可以进行查看 xff1a docker network ls NETWORK ID NAME DRIVER SCOPE b
  • IOS开发入门(11)-导航控制器(1)

    IOS开发入门 xff08 11 xff09 导航控制器I xff1a 层级结构和标签 前言 xff1a xff08 直接从书上抄的 xff09 大多数应用程序是由主视图导出多个屏幕 xff0c 并且通常情况下实现屏幕切换的方法还不止一种
  • IOS开发入门(12)-表视图I:基础知识

    IOS开发入门 xff08 12 xff09 表视图I xff1a 基础知识 在前面几部分中 xff0c 主屏幕只能展示一个汽车对象的信息 而在实际iOS中 xff0c 一次显示多条数据并实现滚动查看是十分常见的 xff0c 例如通讯录 音
  • C语言基础专题 - 头文件引用

    C语言基础专题 头文件引用 jcLee的个人博客 xff1a https blog csdn net qq 28550263 spm 61 1001 2101 3001 5343 邮箱 xff1a 291148484 64 163 com
  • Vue3 配置代理和使用全局axios请求数据

    更详细请参考 xff1a https blog csdn net qq 28550263 article details 120633610 vue3中配置全局代理和使用axios向服务器请求数据 main ts span class to
  • ros(13):ros找不到包报错及解决办法--Config.cmake

    目录 一 基础包 1 1 rospy包 1 2 tf包 1 3 grid map包 1 4 serial 二 专有包 2 1 dynamic reconfigure包 2 2 rosparam handler包 2 3 qt build包
  • 使用Java实现高效的字符串匹配算法

    摘要 xff1a 字符串匹配是计算机领域中的一个重要问题 xff0c 有着广泛的应用场景 在本篇博客文章中 xff0c 我们将介绍几种高效的字符串匹配算法 xff0c 并给出使用Java语言实现的代码示例 xff0c 希望能对读者理解和应用
  • WebDAV是什么

    WebDAV学习及使用 WebDAV是什么WebDEV怎么用各个设备连接1 Window2 MAC WebDAV是什么 基于Web的分布式编写和版本控制 xff08 WebDAV xff09 是超文本传输协议 xff08 HTTP xff0
  • 【计算机基础】整数的补码表示及负整数的左右移

    作者 xff1a LogM 本文原载于 https segmentfault com u logm articles xff0c 不允许转载 文章难免有错误之处 xff0c 请在原文评论处指出 1 补码的表示形式 计算机中整数用补码表示 举
  • Linux 获取内存页大小

    如何查看Linux系统的内存页大小 xff1a 1 getconf PAGESIZE PAGE SIZE 返回值单位为Bytes 点击 此处 折叠或打开 root 64 localhost nginx 1 8 0 getconf PAGES
  • Linux C++服务端开发教程(四) 内存泄露检查

    如何知道内存泄漏 我们如果不去特意查内存泄漏 xff0c 实际上是很难发现的 xff0c 因为这个程序即使发生内存泄漏 xff0c 他也不会有任何特征 泄漏速度不是很快 xff0c 知道某一天 xff0c 我们发现系统运行变慢了 xff0c
  • ubuntu18.04 docker开启2375远程端口

    docker开启2375端口 查询docker服务 查询docker服务 systemctl status docker service 可以看到 docker service 在 etc systemd system 目录下 xff0c
  • 【银河麒麟V10】【服务器】最小化系统安装桌面环境

    1 先制作本地镜像源 本地镜像源搭建方法可参考 xff1a 麒麟V10服务器搭建本地镜像源 https mp csdn net mp blog creation editor 120703047 2 安装桌面环境 yum grouplist
  • 第三方登录之数据库设计

    第三登录之数据库设计 现在很多网站和应用都会接入第三方登录来减少用户注册 xff0c 即方便又快捷 比如说qq登录 xff0c 微信 xff0c 新浪微博等方式 关于第三方登录数据库设计 xff0c 涉及到2张表的设计 xff0c 一张用户
  • 51单片机的定时器/计数器

    7 2 2 定时器 计数器的结构 51单片机的定时器 计数器结构如图7 7所示 T0由特殊功能寄存器TH0 TL0构成 T1由特殊功能寄存器TH1 TL1构成 T0 和T1都具有定时器和计数器两种工作模式 xff0c 4种工作方式 xff0
  • 汇编指令控制单片机LED灯

    一 点亮LED灯 简单的对P1口进行操作就可以了 代码 xff1a ORG 0000H AJMP MAIN ORG 0100H MAIN MOV P1 0FEH 点亮LED1 AJMP MAIN END 二 延时控制流水灯 延时程序生成 x
  • <数据结构> 顺序表

    目录 一 顺序表介绍 二 准备工作 1 创建顺序表 2 初始化顺序表 3 检测是否需要扩容 4 销毁顺序表 5 打印顺序表 三 四大功能 1 增加数据 头插 尾插 指定下标插入 2 删除数据 头删 尾删 指定下标删除 3 查找数据 4 修改