一、顺序表:逻辑相邻,物理地址也相邻
二、顺序表的结构:
三、 顺序表的操作:
1、初始化
2、任意pos位置的插入
3、删除某个数据
4、删除指定位置的数据,并保存该数据。
5、获取任意位置的数据
6、修改任意位置的数据
7、查找某个数据,并返回其下标
8、打印顺序表
9、销毁
//Seqlist.h
//定长顺序表
#pragma once
#define size 10
typedef struct Seqlist
{
int elem[size]; //存储数据
int length; //顺序表的有效数据个数
}Seqlist;
typedef Seqlist *PSeqlist;
void InitSeqlist(PSeqlist ps); //初始化
bool Insert(PSeqlist ps,int pos,int val); //任意位置插入
bool DeleteVal(PSeqlist ps,int key); //删除key值
bool DeletePos(PSeqlist ps,int pos,int *rtval);//删除pos位置的数据,并保存该位置的数据,rtval输出参数
int GetVal(PSeqlist ps,int pos,int *rtval); //获取pos位置的数据
bool SetVal(PSeqlist ps,int pos,int newval); //修改pos位置的数据
int Search(PSeqlist ps,int key);//查找数据,找到:返回下标 找不到:返回-1
bool IsEmpty(PSeqlist ps); //判空
//static bool IsFull(PSeqlist ps); //判满
int GetLength(PSeqlist ps); //求有效数据个数
void Show(PSeqlist ps); //打印
void Destroy(PSeqlist ps); //销毁
//Seqlist.c
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Seqlist.h"
void InitSeqlist(PSeqlist ps) //初始化
{
assert(ps != NULL);
if(ps == NULL)
{
return;
}
ps->length = 0; //当前顺序表中无数据
}
static bool IsFull(PSeqlist ps) //判满
{
return ps->length == size;
}
bool Insert(PSeqlist ps,int pos,int val) //任意位置插入
{
assert(ps != NULL);
if(pos < 0 || pos > ps->length)
{
return false;
}
if(IsFull(ps)) //判满
{
return false;
}
for(int i=ps->length-1;i>=pos;i--)
{
ps->elem[i+1] = ps->elem[i]; //从pos位置,向后移动数据
}
ps->elem[pos] = val; //插入数据
ps->length++; //更新有效数据个数
return true;
}
bool DeleteVal(PSeqlist ps,int key) //删除key值
{
assert(ps != NULL);
if(IsEmpty(ps))
{
return false;
}
int i = Search(ps,key); //查找要删除值的下标
if(i != -1)
{
return DeletePos(ps,i,NULL); //删除该下标的值
}
return true;
}
bool DeletePos(PSeqlist ps,int pos,int *rtval)//删除pos位置的数据,并保存该位置的数据,rtval输出参数
{
assert(ps != NULL);
if(IsEmpty(ps))
{
return false;
}
if(pos < 0 || pos > ps->length-1)
{
return false;
}
if(rtval != NULL) //保存删除位置的数据
{
*rtval = ps->elem[pos];
}
for(int i=pos;i<ps->length-1;i++) //删除数据,从pos后向前移数据
{
ps->elem[i] = ps->elem[i+1];
}
ps->length--; //更新有效数据个数
return true;
}
int GetVal(PSeqlist ps,int pos,int *rtval) //获取pos位置的数据
{
assert(ps != NULL);
if(IsEmpty(ps))
{
return false;
}
*rtval = ps->elem[pos]; //保存pos位置的数据
return *rtval;
}
bool SetVal(PSeqlist ps,int pos,int newval) //修改pos位置的数据
{
assert(ps != NULL);
if(IsEmpty(ps))
{
return false;
}
ps->elem[pos] = newval;
return true;
}
int Search(PSeqlist ps,int key)//查找数据,找到:返回下标 找不到:返回-1
{
assert(ps != NULL);
int i=ps->length-1;
for(;i>0;i--)
{
if(ps->elem[i] == key)
{
return i;
}
}
return -1;
}
bool IsEmpty(PSeqlist ps) //判空
{
return ps->length == 0;
}
int GetLength(PSeqlist ps)//求有效数据个数
{
return ps->length ;
}
void Show(PSeqlist ps)//打印
{
for(int i=0;i< ps->length;i++)
{
printf("%d ",ps->elem[i]);
}
printf("\n");
/*for(int i=ps->length-1;i>0;i--)
{
printf("%d ",ps->elem[i]);
}*/
}
void Destroy(PSeqlist ps) //销毁
{
ps->length = 0;
}
//main.c
#include<stdio.h>
#include"Seqlist.h"
int main()
{
Seqlist p; //相当于PSeqlist == Seqlist *
InitSeqlist(&p);
for(int i=0;i<10;i++)
{
Insert(&p,i,i); //所有测试用例
}
Show(&p);
DeleteVal(&p,9);
Insert(&p,2,30);
Show(&p);
int a;
int *rtval = &a;
DeletePos(&p,3,rtval);
Show(&p);
printf("%d\n",Search(&p,6));
SetVal(&p,5,12);
Show(&p);
printf("%d\n",GetVal(&p,3,rtval));
Destroy(&p);
return 0;
}