【数据结构——顺序表重点代码详细写法】

本文详细介绍了C语言中基于第二种设计的顺序表数据结构,涵盖了初始化、获取大小、容量、判断空/满、插入元素、尾插法、头插法以及扩容等关键功能的实现代码。
摘要由CSDN通过智能技术生成

基于上次三种顺序表比较:数据结构——顺序表三种数据结构比较 该篇文章所展示的顺序表重点代码以第二种顺序表数据结构为例。

数据结构如下:

#include <stdio.h>
#include<stdlib.h>

//第二种设计方式
#define SEQSIZE 100
#define INCSIZE 2 //顺序表空间不足时,每次增加的空间数量
typedef int ElemType;
typedef struct 
{
	ElemType* data;
	int curpos;//已存储的元素数量
	int capacity;//能够存储的最大数量
}SeqList;

重点需要写的功能代码为:initList、getSize、getcapsize、isEmpty、isFull,insertElem、push_back、push_front、Incsize(增容)、printfList,destroyList、clearList这几个函数。

下面是具体实现代码:
SeqList.hpp

#ifndef SEQLIST_HPP
#define SEQLIST_HPP

#define SEQSIZE 100
#define INCSIZE 2 //顺序表空间不足时,每次增加的空间数量
typedef int ElemType;
typedef struct 
{
	ElemType* data;
	int curpos;//已存储的元素数量
	int capacity;//能够存储的最大数量
}SeqList;

extern void initList(SeqList *list);//extern外部关键字,其他人员或者其他文件可以调用
extern int getSize(const SeqList *list);//获取顺序表当前的大小
extern int getCapacity(const SeqList *list);//获取顺序表容量大小
extern bool isEmpty(const SeqList *list);//判断顺序表是否为空
extern bool isFull(const SeqList *list);//判断顺序表是否满了
extern void insertElem(SeqList *list,int pos,ElemType value);//按照位置插入
extern void push_back(SeqList *list,ElemType value)//尾插法
extern void push_front(SeqList *list,ElemType value)//头插法
extern void printfList(const SeqList *list);//打印顺序表
extern void destroyList(SeqList *list)//摧毁顺序表
extern void clearList(SeqList *list)//清除顺序表
#endif

SeqList.cpp

#include "SeqList.h"
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
//申请空间
static ElemType* GetMem(int size)//static静态关键字,只在子文件有效,其他文件不可引用
{
	ElemType* s = (ElemType*)malloc(sizeof(ElemType)*size);
	if(nullptr == s) exit(1);
	memset(s,0,sizeof(ElemType)*size);
	return s;
}
//增容
static bool IncSize(SeqList *list)
{
	ElemType* newdata = GetMem(list->capacity *INCSIZE);
	memmove(newdata,list->data,sizeof(ElemType)*list->capacity);
	free(list->data);
	list->data = newdata;
	list->capacity = list->capacity * INCSIZE;
	return true;	
}
//初始化
void initList(SeqList *list)
{
	assert(list!= nullptr);
	list->data = GetMem(SEQSIZE);
	if(!list->data)
	{
		exit(EXIT_FAILURE);
	}
	list->curpos = 0;
	list->capacity = SEQSIZE;
}
//获取顺序表当前的大小
int getSize(SeqList *list)
{
	assert(list!= nullptr);
	return list->curpos;
}
//获取顺序表容量大小
int getCapacity(const SeqList *list)
{
	assert(list!= nullptr);
	return list->capacity;
}
//判断顺序表是否为空
bool isEmpty(const SeqList *list)
{
	assert(list!= nullptr);
	if(list->curpos == 0)
	{
		return true;
	}
	return false;
}
//判断顺序表是否满了
bool isFull(const SeqList *list)
{
	assert(list!= nullptr);
	if(list->curpos == list->capacity)
	{
		return true;
	}
	return false;
}
//按照位置插入
bool insertElem(SeqList *list,int pos,ElemType value)
{
	assert(list!= nullptr);
	if(pos<0||pos>list->curpos)
	{
		return false;
	}
	for(int i = list->curpos;i>pos; i--)
	{
		list->data[i] = list->data[i-1];
	}
	list->data[pos] = value;
	list->curpos++;
	return true;
}
//尾插法
void push_back(SeqList *list,ElemType value)
{
	assert(list!=NULL);
	insertElem(list,list->curpos,value);
}
//头插法
void push_front(SeqList *list,ElemType value)
{
	assert(list!=nullptr);
	insertElem(list,0,value);
}
//打印顺序表
void printfList(const SeqList *list)
{
	assert(list!=NULL);
	for(int i = 0;i < list->curpos;i++)
	{
		printf("%d\n",list->data[i]);
	}
	printf("\n");
}
//摧毁顺序表
void destroyList(SeqList *list)
{
	assert(list!=NULL);
	free(list->data);
	list->data = NULL;
	list->curpos = 0;
	list->capacity = 0;
}
//清除顺序表
void clearList(SeqList *list)
{
	assert(list!=NULL);
	//将 curpos 置为 0 就足够了,不需要将数据置为 0
	//置为0实际上是浪费时间,因为之后可能会重新填充数据。
	list->curpos = 0;
}
int main()
{
	SeqList mylist;
	initList(&mylist);
	for(int i = 0;i<20;i++)
	{
		push_back(&mylist,i);
	}
	printfList(&mylist);
}

部分关键知识点

  • extern外部关键字,其他人员或者其他文件可以调用
  • static静态关键字,只在子文件有效,其他文件不可引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值