基于上次三种顺序表比较:数据结构——顺序表三种数据结构比较 该篇文章所展示的顺序表重点代码以第二种顺序表数据结构为例。
数据结构如下:
#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静态关键字,只在子文件有效,其他文件不可引用