1、顺序表
顺序表特点:在逻辑上是连续的,在物理存储空间上也是连续。--数组
顺序表中存储的元素必须从空间的首位置开始储存,而且必须是连续存放,中间不能有空的空间。
2、顺序表的实现声明
#include<stdio.h>
//结构体声明
typedef int DataType;
typedef struct SqList
{
DataType* data;//指向存储空间的指针
int length;//存储元素的个数
int size;//当前空间大小,单位是元素个数
}SqList;
//操作方法的声明
bool InitSqList(SqList* sq,int init_size=10);
bool DestroySqList(SqList* sq);
//插入一个元素
//1、按指定位置插入
bool InsertPos(SqList* sq,DataType value,int pos);
//2、头插法
bool InsertFront(SqList* sq,DataType value);
//3、尾插法
bool InsertRear(SqList* sq,DataType value);
int LengthSqList(SqList* sq);
bool DeletePos(SqList* sq,int pos);
bool DeleteFront(SqList* sq);
bool DeleteRear(SqList* sq);
bool IsEmpty(SqList* sq);
//比较方法
typedef bool(*Compare)(DataType,DataType);
bool DeleteValue(SqList* sq,DataType value,Compare cp);
方法实现:
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include"head.h"
//方法的实现
//static如果修饰我们函数,则只有在本文件中看到这个函数
//在其他文件中看不到
static bool IsFull(SqList *sq)
{
return sq->length==sq->size;
}
static bool AppendSpace(SqList *sq)
{
//申请新的空间
int size=sq->size==0?10:sq->size*2;
DataType *new_space=(DataType*)malloc(sizeof(DataType)*size);
if(new_space==NULL) return false;
//将原始空间的数据全部导入新的空间中
for (int i = 0; i < sq->size; ++i)
{
new_space[i]=sq->data[i];
}
//释放sq->data指向的内存空间,否则会发生内存泄露
free(sq->data);
sq->data=new_space;
sq->size=size;
return true;
}
//给sq中三个成员变量设置初始值
bool InitSqList(SqList *sq,int init_size)
{
//完成安全检测
if(sq==NULL&&init_size<=0)
{
return false;
}
sq->data=(DataType*)malloc(init_size *sizeof(DataType));
if(sq->data==NULL) false;
sq->length=0;
sq->size=init_size;
return true;
}
bool DestroySqList(SqList *sq)
{
if(sq==NULL) return false;
free(sq->data);
sq->data=NULL;//防止出现野指针
sq->length=sq->size=0;
return true;
}
bool InsertPos(SqList *sq,DataType value,int pos)
{
if(sq==NULL) return false;
if(pos<0||pos>sq->length) return false;
if(IsFull(sq)&&!AppendSpace(sq)) return false;
//在pos位置插入value值
//1、把pos后面的元素往后挪一位
//2、在pos位置插入value值
//3、length++
for(int i=sq->length;i>pos;i--)
{
sq->data[i]=sq->data[i-1];
}
sq->data[pos]=value;
sq->length++;
return true;
}
bool InsertFront(SqList *sq,DataType value)
{
return InsertPos(sq,value,0);
}
bool InsertRear(SqList *sq,DataType value)
{
if(sq==NULL) return false;
return InsertPos(sq,value, sq->length);
}
int LengthSqList(SqList *sq)
{
if(sq==0) return false;
return sq->length;
}
bool DeletePos(SqList *sq,int pos)
{
if(sq==NULL) return false;
if(pos<0&&pos>sq->length) return false;
for(int i=pos;i>pos;i--)
{
sq->data[i]=sq->data[i+1];
}
sq->length--;
return true;
}
bool DeleteFront(SqList *sq)
{
return DeletePos(sq,0);
}
bool DeleteRear(SqList *sq)
{
return DeletePos(sq,sq->length-1);
}
bool IsEmpty(SqList *sq)
{
if(sq==NULL||sq->length==0) return true;
return false;
}
根据值删除
//bool DeleteValue(SqList *sq,DataType value,Compare cp)
//{
// if(IsEmpty(sq)) return false;
// for(int i=0;i<sq->length;i++)
// {
// if(cp(sq->data[i],value))
// {
// DeletePos(sq,i);
// }
// else
// {
// i++;
// }
//
// }
// return true;
//}
//O(n)
bool DeleteValue(SqList *sq,DataType value,Compare cp)
{
if(IsEmpty(sq)) return false;
int index=0;
for(int i=0;i<sq->length;i++)
{
if(!cp(sq->data[i],value))
{
sq->data[index++]=sq->data[i];
}
}
sq->length=index;
return true;
}
void PrintSqList(SqList *sq)
{
assert(sq!=NULL);
for(int i=0;i<sq->length;i++)
{
printf("%d ",sq->data[i]);
}
printf("\n");
}
int main()
{
SqList sql;
InitSqList(&sql);
InsertPos(&sql,1,0);
InsertPos(&sql,2,1);
InsertFront(&sql,0);
InsertRear(&sql,3);
printf("存储元素个数为:%d\n",LengthSqList(&sql));
DeletePos(&sql,3);
PrintSqList(&sql);
return 0;
}