数据结构静态顺序表

顺序表:用一段地址连续存储单元依次存储数据元素的线性结构。

#define MAX_SIZE 10
typedef int DataType;
struct SeqList
{DataType _array[MAX_SIZE];
int _size;//顺序表中元素的个数}

以上代码,就是创建一个顺序表,其中SeqList是整个顺序表的空间而size是顺序表中元素的个数。

接下来我将用静态顺序表来实现尾插,头插,任意插入数据,尾删,头删等

头文件:


  
  
#ifndef __SEP__LIST__ #define __SEP__LIST__
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h>
#define MAX_SIZE 10 typedef int DataType; typedef struct seqlist {  DataType arr[MAX_SIZE];  size_t size;//顺序表中元素的个数
}SeqList,*PseqList; //初始化顺序表 void InitSeqList(SeqList* seqList); //在顺序表中尾插元素data void PushBack(SeqList* seqList, DataType data); //将顺序表的尾部元素抛出 void PopBack(SeqList* seqList); //头插data void PushFront(SeqList* pSeqList, DataType data); //头删 void PopFront(SeqList* pSeqList); //查找data,返回该元素的顺序表的位置 int Find(SeqList* pSeqList, DataType data); //在顺序表的pos的位置插入元素 void Insert(SeqList* pSeqList, size_t pos, DataType data); //删除顺序表pos位置的元素 void Erase(SeqList* pSeqList, size_t pos); //移除顺序表中值为data 的值 void Remove(SeqList* pSeqList, DataType data); //移除顺序表中所有值为data 的值 void RemoveAll(SeqList* pSeqList, DataType data); #endif

函数实现部分

#include "seqlist.h"

void InitSeqList(SeqList* seqList)
{
	assert(seqList);
	memset(seqList, 0, sizeof(DataType)*MAX_SIZE);//可以一个字节一个字节的把整个数组设置成指定的值(第一个参数是起始地址,第二个是设置数组每个字节的值,第三个是数组长度)
	seqList->size = 0;//插入数据从顺序表的最开始插入


}

void PushBack(SeqList* seqList, DataType data)
{
	assert(seqList);
	if (MAX_SIZE == seqList->size)
	{
		printf("顺序表已经满\n");
		return;
	}
	seqList->arr[seqList->size] = data;
	seqList->size++;
}
void PopBack(SeqList* seqList)
{
	assert(seqList);
	if (0 == seqList->size)
	{
		printf("顺序表是空的,不能Pop\n");
		return;

	}
	seqList->size--;//此时顺序表中元素没有被真正删除,只是使得Pop的元素无效
}

void PushFront(SeqList* pSeqList, DataType data)
{
	size_t index = pSeqList->size;
	assert(pSeqList);
	if (MAX_SIZE == pSeqList->size)
	{
		printf("顺序表已经满");
		return;
	}
	for (; index > 0; index--)
	{
		pSeqList->arr[index] = pSeqList->arr[index - 1];//顺序表是从第一位插入的,所以以后的元素要向后移动,否则会被覆盖。

	}
	pSeqList->arr[index] = data;
	pSeqList->size++;
}  
void Popfront(SeqList* pSeqList)
{
	size_t index = 1;
	assert(pSeqList);
	if (0 == pSeqList->size)
	{
		printf("顺序表为空不能POP");
		return;
	}
	for (; index < pSeqList->size; index++)
	{
		pSeqList->arr[index - 1] = pSeqList->arr[index];
		//index=1在操作时对它减一,是因为害怕数组越界。
	}
	pSeqList->size--;
} 

int Find(SeqList* pSeqList, DataType data)
{
	size_t index = 0;
	assert(pSeqList);
	for (; index < pSeqList->size; index++)
	{
		if (pSeqList->arr[index] == data)
		{
			return index + 1;
			
		}
	}
	return -1;//位置不会是负数,当返回-1时,知道顺序表中没有想要的数据
}

void Tnsert(SeqList* pSeqList, size_t pos, DataType data)
{
	size_t index = pSeqList->size;
	assert(pSeqList);
	if (pos > pSeqList->size)
	{
		printf("插入位置不合法\n");//保证插入的元素都是连续的
		return;
	}
	if (MAX_SIZE == pSeqList->size)
	{
		printf("顺序表满了\n");
		return;
	}
	for (; index >= pos; index--)
	{
		pSeqList->arr[index] = pSeqList->arr[index - 1];
		//把插入数据及其后面的元素向后移动。
	}
	pSeqList->arr[index] = data;
	pSeqList->size++;

}

void Erase(SeqList* pSeqList, size_t pos)
{
	size_t index = pos - 1;
	assert(pSeqList);
	if (pos > pSeqList->size)
	{
		printf("这个位置没有存储数据元素");
		return;//否则会溢出
	}
	for (; index < pSeqList->size - 1; index++)
	{
		pSeqList->arr[index] = pSeqList->arr[index + 1];
//此时数组下标不会越界,index最多到size-2。
	}
	pSeqList->size--;

}
void Remove(SeqList* pSeqList, DataType data)
{
	size_t index = 0;
	size_t temp = 0;
	assert(pSeqList);
	for (; index < pSeqList->size;index++)
	{
		if (pSeqList->arr[index] == data)
		{
			for (temp = index; temp < pSeqList->size - 1; temp++)
			{
				pSeqList->arr[temp] = pSeqList->arr[temp + 1];//在顺序表中找到该数时,就把后面的元素向前移动一位,达到消除目的
			}
			pSeqList->size--;
			return;
		}
	}
}
void RemoveAll(SeqList* pSeqList, DataType data);
{size_t index = 0;
size_t rem = 0;
assert(pSeqList);
for (; index < pSeqList->size; index++)
{
	if (pSeqList->arr[index] == data)
	{
		for (rem = index; rem < pSeqList->size - 1; rem++)
		{
			pSeqList->arr[rem] = pSeqList->arr[rem + 1];
	
		}
		pSeqList->size--;
		index--;
	}
}
}


测试部分

#include "seqlist.h"
SeqList seqList;

//尾插尾删
void TestFun1()
{
	InitSeqList(&seqList);
	PushBack(&seqList, 1);
	PushBack(&seqList, 2);
	PushBack(&seqList, 3);
	PushBack(&seqList, 4);
	printSeqList(&seqList);
	PopBack(&seqList);
	PopBack(&seqList);
	printSeqList(&seqList);
	
}
//测试头插头删
void TestFun2()
{
	InitSeqList(&seqList);
	pushFornt(&seqList, 1);
	pushFornt(&seqList, 2);
	pushFornt(&seqList, 3);
	pushFornt(&seqList, 4);
	printSeqList(&seqList);
	PopFront(&seqList);
	PopFront(&seqList);
	printSeqList(&seqList);

}
//测试在任意位置插入删除data
void TestFun3()
{
	int ret = 0;
	InitSeqList(&seqList);
	pushFornt(&seqList, 1);
	pushFornt(&seqList, 2);
	pushFornt(&seqList, 3);
	pushFornt(&seqList, 4);
	ret = Find(&seqList,4);
	Insert(&seqList, 3, 5);
	Erase(&seqList,5);
	printf("%d\n",ret);
	printSeqList(&seqList);
}
//测试移除data
void TestFun3()
{
	
	InitSeqList(&seqList);
	pushFornt(&seqList, 1);
	pushFornt(&seqList, 2);
	pushFornt(&seqList, 2);
	pushFornt(&seqList, 4);
	pushFornt(&seqList, 1);
	pushFornt(&seqList, 2);
	pushFornt(&seqList, 2);
	pushFornt(&seqList, 4);
	Remove(&seqList, 2);
	printSeqList(&seqList);
	RemoveAll(&seqList,2);
	printSeqList(&seqList);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值