typedef作用:
给以有的类型起别名
把一切合法的变量名声明转化为类型
#include<stdio.h>
#include<iostream>
#include<assert.h>
#include<vector>
#include<map>
#include<stack>
#include<queue> //C++中本身提供了栈和队列
#include<unordered_map>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1//不能实行
#define OVERFLOW -2//内存溢出
typedef int Status;//状态
#define SEQ_INIT_SIZE 2
#define SEQ_INC_SIZE 2
typedef int ElemType;
typedef struct
{
ElemType* data;
int capacity;//容量
int cursize;//元素的个数
}SeqList;
void InitSeqList(SeqList* plist)//初始化
{
assert(plist != NULL);
plist->capacity = SEQ_INIT_SIZE;
plist->cursize = 0;
plist->data = (ElemType*)malloc(sizeof(ElemType) * plist->capacity);
if (NULL == plist->data)
{
printf(" \n");
exit(EXIT_FAILURE);
}
}
int GetSize(const SeqList* plist)//获的个数
{
assert(plist != NULL);
return plist->cursize;
}
bool IsEmpty(const SeqList* plist)//判空
{
assert(plist != NULL);
return GetSize(plist) == 0;
//return plist->cyrsize==0;
}
int GetCapacity(const SeqList* plist)//获得容量
{
assert(plist != NULL);
return plist->capacity;
}
bool IsFull(const SeqList* plist)//判满
{
assert(plist != NULL);
return GetSize(plist) == GetCapacity(plist);
//return plist->cursize==plist->capacity;
}
void PrintSeqList(const SeqList* plist)//打印
{
assert(plist != NULL);
printf("Capacity: %d \n", plist->capacity);
printf("Cursize: %d \n", plist->cursize);
for (int i = 0; i < plist->cursize; ++i)
{
printf("%3d", plist->data[i]);
}
printf("\n");
}
int FindValue(const SeqList* plist,ElemType val)//按值查询
{
assert(plist != NULL);
int pos = -1;
for (int i = 0; i < plist->cursize; ++i)
{
if (val == plist->data[i])
{
pos = i;
break;
}
}
return pos;
}
bool Inc_Capacity(SeqList* plist)//扩容
{
assert(plist != NULL);
int total = plist->capacity * SEQ_INC_SIZE;
ElemType* newdata = (ElemType*)realloc(plist->data, sizeof(ElemType) * total);
if (NULL == newdata)
{
return false;
}
plist->data = newdata;
plist->capacity = total;
return true;
}
Status InsertItem(SeqList* plist,int pos,ElemType val)//按位置插入
{
assert(plist != NULL);
if (pos<0 || pos>plist->cursize)
{
return INFEASIBLE;//-1
}
if (IsFull(plist) && !Inc_Capacity(plist))
{
return OVERFLOW;//-2
}
for (int i = plist->cursize; i > pos; --i)
{
plist->data[i] = plist->data[i - 1];
}
plist->data[pos] = val;
plist->cursize += 1;
return OK;
}
void Push_Back(SeqList* plist, ElemType val)//尾插
{
assert(plist != NULL);
InsertItem(plist, plist->cursize, val);
}
void Push_Front(SeqList* plist, ElemType val)//头插
{
assert(plist != NULL);
InsertItem(plist, 0, val);
}
Status EraseItem(SeqList* plist, int pos)//按位置删除
{
assert(plist != NULL);
if (pos<0 || pos>plist->cursize - 1)
{
return INFEASIBLE;
}
for (int i = pos;i< plist->cursize; ++i)
{
plist->data[i] = plist->data[i + 1];
}
plist->cursize -= 1;
return OK;
}
void Pop_Back(SeqList* plist)//尾删
{
assert(plist != NULL);
EraseItem(plist, plist->cursize - 1);
}
void Pop_Front(SeqList* plist)//头删
{
assert(plist != NULL);
EraseItem(plist, 0);
}
bool LocateElem(const SeqList* plist, ElemType val)//判断元素是否在表中
{
assert(plist != NULL);
return FindValue(plist, val) != -1;
}
Status Remove(SeqList* plist, ElemType val)//删除数据元素
{
assert(plist != NULL);
return EraseItem(plist, FindValue(plist, val));
}
void DestorySeqList(SeqList* plist)//销毁
{
assert(plist != NULL);
plist->capacity = 0;
plist->cursize = 0;
free(plist->data);
}
void ClearSeqList(SeqList* plist)//重置为空表
{
assert(plist != NULL);
plist->cursize = 0;
}
顺序表
空间连续;
空间利用率高,不容易造成内存碎片
适用的场景:
- 支持随机访问
- 尾插尾删效率高
不适用的场景:
1.头插头删,中间插入,删除效率低。不适合这些位置的插入,删除
2. 增容代价高:申请,拷贝,释放
使用场景:适用于需要大量随机访问数据元素的场景,而增加/删除数据元素较少的程序中使用顺序表。