【数据结构】顺序表
关于基础数据结构,分为两类:
①线性:数组、链表、顺序表
②非线性:树、图
顺序表和链表的区别:
顺序表:逻辑连续、物理连续
链表:逻辑连续、物理不一定连续
顺序表可细分为两类:
①定长顺序表(在栈内操作)
②不定长顺序表(可扩容,在堆内操作)
↑因此顺序表一般都通过创建数组来建立。
此篇博客专门针对定长顺序表做一些操作!!
初始化:
void InitList(PSeqList pl)
{
assert(pl != NULL);
if(pl == NULL)
{
return ;
}
pl ->cursize =0;//将初始长度置为0
}
初始化长度为0
按位插入:
//按位插入
int InsertPos(PSeqList pl,int pos,ELEM_TYPE val)
{
if(pl == NULL)
{
return ;
}
if(pos<0 || pos>pl->cursize || IsFull (pl))
{
return -1;
}
for(int i=pl->cursize -1;i>=pos;i--)
{
pl->elem [i+1]=pl->elem [i];
}
pl->elem [pos]=val;
pl->cursize ++;//一定别忘了插入后长度+1
return 1;
}
按位删除:
//按位删除
int DeletePos(PSeqList pl,int pos)
{
if(pl == NULL)
{
return 0;
}
if(pos<0 || pos>pl->cursize -1)
{
return -1;
}
for(int i=pos;i<pl->cursize -1;i++)
{
pl->elem [i]=pl->elem [i+1];
}
pl->cursize --;
return 1;
}
按元素删除:
//按元素删除
int DeleteKey(PSeqList pl,ELEM_TYPE key)
{
if(pl==NULL)
{
return 0;
}
int i=0;
//遍历数组,看key是否存在
for(i;pl->elem [i]!=key;i++)
{
if(i==pl->cursize -1)
{
return -1;
}
}
for(int j=i;j<pl->cursize ;j++)
{
//若找到
if(pl->elem [j]==key)
{
//删除
for(int k=j;k<pl->cursize -1;k++)
{
pl->elem [k]=pl->elem [k+1];
}
pl->cursize --;
j--;
}
}
return 1;
}
其他功能:
//查找元素
int Search(PSeqList pl,ELEM_TYPE key)
{
int find=-1;
if(pl !=NULL)
{
for(int i=0;i<pl->cursize ;i++)
{
if(pl->elem [i]==key)
{
find=i;
break;
}
}
}
return find;
}
//判满
bool IsFull(PSeqList pl)
{
if(pl->cursize ==ARRAY_SIZE )
{
return 1;
}
return 0;
}
//显示函数
void Show(PSeqList pl)
{
for(int i=0;i<pl->cursize;i++)
{
printf("%d ",pl->elem [i]);
}
}
//清空数据
void Clear(PSeqList pl)
{
pl->cursize =0;
}
//销毁顺序表
void Destroy(PSeqList pl)
{
Clear (pl);
}
完整代码如下:
SeqList.h
#include<stdio.h>
#define ARRAY_SIZE 5
typedef int ELEM_TYPE;//方便于修改元素的类型,不仅限于int型
//定义结构体
typedef struct SeqList
{
ELEM_TYPE elem[ARRAY_SIZE ];//定义数组
int cursize;//数组长度
}SeqList ,*PSeqList;
//初始化
void InitList(PSeqList pl);
//按位插入
int InsertPos(PSeqList pl,int pos,ELEM_TYPE val);
//按位删除
int DeletePos(PSeqList pl,int pos);
//按元素删除
int DeleteKey(PSeqList pl,ELEM_TYPE key);
//查找元素
int Search(PSeqList pl,ELEM_TYPE key);
//判满
bool IsFull(PSeqList pl);
//显示函数
void Show(PSeqList pl);
//清空数据
void Clear(PSeqList pl);
//销毁顺序表
void Destroy(PSeqList pl);
SeqList.cpp
#include<stdio.h>
#include "SeqList.h"
#include<assert.h>
//初始化
void InitList(PSeqList pl)
{
assert(pl != NULL);
if(pl == NULL)
{
return ;
}
pl ->cursize =0;//将初始长度置为0
}
//按位插入
int InsertPos(PSeqList pl,int pos,ELEM_TYPE val)
{
if(pl == NULL)
{
return 0;
}
if(pos<0 || pos>pl->cursize || IsFull (pl))
{
return -1;
}
for(int i=pl->cursize -1;i>=pos;i--)
{
pl->elem [i+1]=pl->elem [i];
}
pl->elem [pos]=val;
pl->cursize ++;//一定别忘了插入后长度+1
return 1;
}
//按位删除
int DeletePos(PSeqList pl,int pos)
{
if(pl == NULL)
{
return 0;
}
if(pos<0 || pos>pl->cursize -1)
{
return -1;
}
for(int i=pos;i<pl->cursize -1;i++)
{
pl->elem [i]=pl->elem [i+1];
}
pl->cursize --;
return 1;
}
//按元素删除
int DeleteKey(PSeqList pl,ELEM_TYPE key)
{
if(pl==NULL)
{
return 0;
}
int i=0;
//遍历数组,看key是否存在
for(i;pl->elem [i]!=key;i++)
{
if(i==pl->cursize -1)
{
return -1;
}
}
for(int j=i;j<pl->cursize ;j++)
{
//若找到
if(pl->elem [j]==key)
{
//删除
for(int k=j;k<pl->cursize -1;k++)
{
pl->elem [k]=pl->elem [k+1];
}
pl->cursize --;
j--;
}
}
return 1;
}
//查找元素
int Search(PSeqList pl,ELEM_TYPE key)
{
int find=-1;
if(pl !=NULL)
{
for(int i=0;i<pl->cursize ;i++)
{
if(pl->elem [i]==key)
{
find=i;
break;
}
}
}
return find;
}
//判满
bool IsFull(PSeqList pl)
{
if(pl->cursize ==ARRAY_SIZE )
{
return 1;
}
return 0;
}
//显示函数
void Show(PSeqList pl)
{
for(int i=0;i<pl->cursize;i++)
{
printf("%d ",pl->elem [i]);
}
}
//清空数据
void Clear(PSeqList pl)
{
pl->cursize =0;
}
//销毁顺序表
void Destroy(PSeqList pl)
{
Clear (pl);
}
main.cpp
#include<stdio.h>
#include "SeqList.h"
int main()
{
SeqList a;
InitList (&a);//初始化
for(int i=0;i<10;i++)
{
InsertPos (&a,i,i+1);
}
DeleteKey(&a,3);
Show(&a);
}