顺序表的增删查改(一)

顺序表

所谓线性表,就是n个数据元素组成的一个有限序列,可以在其任意位置上进行插入和删除操作的线性数据结构。从数据在物理内存存储形式上线性表可分为顺序表和链表

今天我们了解一下顺序表,顺序表就是用一段地址连续的存储单元依次存储数据元素的线性结构。地址连续的存储空间,我们通常会用数组,数组有静态数组和动态数组之分,所以说顺序表也有静态顺序表和动态顺序表之分,我们就先看一看静态顺序表的增删查改的操作。

具体代码如下:

    seqlist.h文件

#pragma once

#include<stddef.h>

#define seqlistMaxNum 10

typedef int seqlistType;
typedef struct SeqList 
{
	seqlistType data[seqlistMaxNum];
	size_t size;//size_t是长整型,需要引用“stddef.h”头文件。此处定义一个size_t型的size为该数组中有效元素的个数
}SeqList;

SeqList seqlist;

void seqlistInit(SeqList *seqlist);//初始化

void ifFull(SeqList *seqlist);//判断顺序表是否满了,每一次对顺序表进行插入操作之前都需要判断
void ifEmpty(SeqList *seqlist);//判断顺序表是否为空,每一次对顺序表进行删除或打印操作时都需要判断
void seqlistPrint(SeqList *seqlist);//打印顺序表中的元素

void seqlistPushBack(SeqList *seqlist,int data);//尾插
void seqlistPopBack(SeqList *seqlist);//尾删

void seqlistPushFront(SeqList *seqlist,int data);//头插
void seqlistPopFront(SeqList *seqlist);//头删
//其中的pos代表'第几个元素' 或 '第几个位置',对应的下标均需要使用(pos-1)
void seqlistInsert(SeqList *seqlist,int pos,int data);//任意位置插入元素
void seqlistErase(SeqList *seqlist,int pos);//任意位置删除元素
void seqlistSet(SeqList *seqlist,int pos,int data);//修改任意位置元素
void seqlistGet(SeqList *seqlist,int pos);//获取任意位置元素
void seqlistFind(SeqList *seqlist,int data);//查找任意元素的下标

seqlist.c文件

#include<stdio.h>
#include<stdlib.h>
#include"seqlist.h"
//测试函数运行会打印当前函数名,便于测试观察
#define head__print printf("\n==========%s==========\n",__FUNCTION__);
//初始化函数
void seqlistInit(SeqList *seqlist)
{
	if(seqlist == NULL)
	{
		return;
	}
   //size是数组中有效元素的个数,因此可直接将size值设为0即可
	seqlist->size = 0;
}
//判断顺序表是否满了
void ifFull(SeqList *seqlist)
{
	if(seqlist == NULL)
	{
		return;
	}
	if(seqlist->size >= seqlistMaxNum)
	{
		printf("the seqlist is full\n");
	}
}
//判断顺序表是否为空
void ifEmpty(SeqList *seqlist)
{
	if(seqlist == NULL)
	{
		return;
	}
	if(seqlist->size == 0)
	{
		printf("the seqlist is empty\n");
	}
}
//打印顺序表中的元素
void seqlistPrint(SeqList *seqlist)
{
	int i = 0;
	if(seqlist == NULL)
	{
		return;
	}
    //打印前需要先判断顺序表中是否存在元素
	ifEmpty(seqlist);
	for(;i < seqlist->size;i++)
	{
		printf("%d ",seqlist->data[i]);
	}
	printf("\n");
}
//尾插
void seqlistPushBack(SeqList *seqlist,int data)
{
	if(seqlist == NULL)
	{
		return;
	}
    //每一次增加元素前需要判断顺序表是否还有可插入的空间,后面不再说明
	ifFull(seqlist);
	++seqlist->size;
	seqlist->data[seqlist->size-1] = data;
}
//尾删
void seqlistPopBack(SeqList *seqlist)
{
	if(seqlist == NULL)
	{
		return;
	}
    //每一次删除前需要判断顺序表中是否存在元素,后面不再说明
	ifEmpty(seqlist);
    //size是数组中有效元素的个数,因此size-1即可达到尾删的目的
	--seqlist->size;
}
//头插
void seqlistPushFront(SeqList *seqlist,int data)
{
	int i = 0;
	if(seqlist == NULL)
	{
		return;
	}
	ifFull(seqlist);
    //将已有的元素后移一位
	for(i = seqlist->size-1;i >= 0;i--)
	{
		seqlist->data[i+1] = seqlist->data[i];
	}
	++seqlist->size;
    //对0号下标位置赋值,完成头插
	seqlist->data[0] = data;
}
//头删
void seqlistPopFront(SeqList *seqlist)
{
	int i = 0;
	if(seqlist == NULL)
	{
		return;
	}
	ifEmpty(seqlist);
    //将0号下标位置(不包括0)往后的所有元素往前移动一位,将数组有效元素个数-1即可
	for(;i < seqlist->size-1;i++)
	{
		seqlist->data[i] = seqlist->data[i+1];
	}
	--seqlist->size;
}
//任意位置插入元素
void seqlistInsert(SeqList *seqlist,int pos,int data)
{
	int i = 0;
	if(seqlist == NULL)
	{
		return;
	}
	ifFull(seqlist);
    //判断目标位置是否合法
	if(pos > seqlist->size)
	{
        //目标位置超出了数组有效元素个数的范围
		return;
	}
    //pos为1时代表0号下标位置,后面不再说明
	if(pos == 1)
		seqlistPushFront(seqlist,data);
    //pos为size大小时代表size-1号下标位置,后面不再说明
	else if(pos == seqlist->size)
		seqlistPushBack(seqlist,data);
	else 
	{
        //将pos位置(包括pos)往后的所有元素后移一位
		for(i = seqlist->size;i >= pos;i--)
		{
			seqlist->data[i] = seqlist->data[i-1];
		}
        //有效元素个数+1
		++seqlist->size;
        //对pos位置赋值
		seqlist->data[pos-1] = data;
	}
}
//任意位置删除元素
void seqlistErase(SeqList *seqlist,int pos)
{
	int i = 0;
	if(seqlist == NULL)
	{
		return;
	}
	ifEmpty(seqlist);
	if(pos == seqlist->size)
		seqlistPopBack(seqlist);
	if(pos == 1)
		seqlistPopFront(seqlist);
	else
	{
        //将pos位置(不包括pos)往后的所有元素往前移动一位
		for(i = pos-1;i < seqlist->size-1;i++)
		{
			seqlist->data[i] = seqlist->data[i+1];
		}
        //有效元素个数-1
		--seqlist->size;
	}
}
//修改任意位置元素
void seqlistSet(SeqList *seqlist,int pos,int data)
{
	if(seqlist == NULL)
	{
		return;
	}
	seqlist->data[pos-1] = data;
}
//获取任意位置元素
void seqlistGet(SeqList *seqlist,int pos)
{
	if(seqlist == NULL)
	{
		return;
	}
	printf("%d\n",seqlist->data[pos-1]);
}
//查找任意元素的下标
void seqlistFind(SeqList *seqlist,int data)
{
	if(seqlist == NULL)
	{
		return;
	}
	int i = 0;
    //count表示查找的目标元素有多少个
	int count = 0;
	for(;i < seqlist->size;i++)
	{
		if(seqlist->data[i] == data)
		{
			printf("%d \n",i);
			++count;
		}
	}
	if(counot == 0)
	{
        //如果count=0说明循环结束没有找到该元素
		printf("non-existent  ");
	}
}
//初始化函数测试
void seqlistTestInit()
{
	head__print;
	printf("expect:0\n");
	seqlistInit(&seqlist);
	printf("%lu\n",seqlist.size);
}
//尾插函数测试
void seqlistTestPushBack()
{
	head__print;
    //期待输出值,后面不再说明
	printf("expect:1 2 3 4\n");
    //4次调用尾插函数,依次插入1,2,3,4
	seqlistPushBack(&seqlist,1);
	seqlistPushBack(&seqlist,2);
	seqlistPushBack(&seqlist,3);
	seqlistPushBack(&seqlist,4);
    //打印顺序表,与期待值对比,后面不再说明
	seqlistPrint(&seqlist);
}
//尾删函数测试
void seqlistTestPopBack()
{
	head__print;
	printf("expect:1 2\n");
	int i = 0;
    //循环调用2次尾删函数,依次删除4,3
	for(i=1;i<=2;i++)
	{
		seqlistPopBack(&seqlist);
	}
	seqlistPrint(&seqlist);
}
//头插函数测试
void seqlistTestPushFront()
{
	head__print;
	printf("expect:8 7 6 5 1 2\n");
    //4次调用头插函数,依次插入5,6,7,8
	seqlistPushFront(&seqlist,5);
	seqlistPushFront(&seqlist,6);
	seqlistPushFront(&seqlist,7);
	seqlistPushFront(&seqlist,8);
	seqlistPrint(&seqlist);
}
//头删函数测试
void seqlistTestPopFront()
{
	head__print;
	printf("expect:6 5 1 2\n");
	int i = 0;
    //依次删除8,7
	for(i = 1;i <= 2;i++)
	{
	seqlistPopFront(&seqlist);
	}
	seqlistPrint(&seqlist);
}
//任意位置插入元素函数测试
void seqlistTestInsert()
{
	head__print;
	printf("expect:6 5 0 1 2\n");
    //3号位置插入0
	seqlistInsert(&seqlist,3,0);
	seqlistPrint(&seqlist);
}
//任意位置删除元素函数测试
void seqlistTestErase()
{
	head__print;
	printf("expect:6 5 0 2\n");
    //删除4号位置元素
	seqlistErase(&seqlist,4);
	seqlistPrint(&seqlist);
}
//修改任意位置元素函数测试
void seqlistTestSet()
{
	head__print;
	printf("expect:6 5 4 2\n");
    //将3号位置元素修改为4
	seqlistSet(&seqlist,3,4);
	seqlistPrint(&seqlist);
}
//获取任意位置元素函数测试
void seqlistTestGet()
{
	head__print;
	printf("expect:2\n");
    //获取4号位置元素
	seqlistGet(&seqlist,4);
}
//查找任意元素的下标函数测试
void seqlistTestFind()
{
	head__print;
	printf("expect:non-existent  1\n");
    //查找元素为1和元素为5的元素下标
	seqlistFind(&seqlist,1);
	seqlistFind(&seqlist,5);
}

int main()
{
    //以下为调用测试函数
	seqlistTestInit();
	seqlistTestPushBack();
	seqlistTestPopBack();
	seqlistTestPushFront();
	seqlistTestPopFront();
        seqlistTestInsert();
	seqlistTestErase();
	seqlistTestSet();
	seqlistTestGet();
	seqlistTestFind();
	return 0;
}

代码运行结果如下:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值