什么是顺序表?
首先顺序表指的是在数据结构中的一种线性存储结构,区别于链式表。
其主要借助元素在存储器中的相对位置来表示数据元素间的逻辑关系。通常存将数据储在一片连续的空间上,例如数组。
结构如下图:
顺序表的实现:
在C语言中,一维数组的元素也是存放于一片连续的存储空间中,故可借助于C语言中一维数组类型来描述线性表的顺序存储结构。
头文件如下:
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include <stdio.h>
#include <stdlib.h>
#define N 10
//顺序表结构的定义
//data为数组,用于存储数据
//last为整形数,用来记录数组中后一个元素的下标
typedef struct seqlist
{
int data[N];
int last;
}seqlist_t;
//创建顺序表
seqlist_t *seqlistCreate();
//判断顺序表是否未满
intisFull(seqlist_t *s);
//判断顺序表是否为空
intisEmtpy(seqlist_t *s);
//插入数据
intseqlistInesert(seqlist_t *s,intvalue,int offset);
//删除数据
intseqlistDelete(seqlist_t *s,int offset);
//查看顺序表
void seqlistShow(seqlist_t *s);
#endif
函数实现如下:
#include "seqlist.h"
//创建顺序表,返回顺序表的地址
seqlist_t *seqlistCreate()
{
seqlist_t *s = NULL;
s = (seqlist_t*)malloc(sizeof(seqlist_t));
if(NULL == s)
{
printf("create err,fail to malloc\n");
return NULL;
}
s->last = -1;
return s;
}
//判断顺序表是否未满,last值为N-1时顺序表为满
intisFull(seqlist_t *s)
{
return s->last == N - 1;
}
//判断顺序表是否为空
intisEmtpy(seqlist_t *s)
{
return s->last == -1;
}
//插入数据
//value:插入数据
//offset:插入位置
intseqlistInesert(seqlist_t *s,intvalue,int offset)
{
if(isFull(s))//判断顺序表是否为满
{
printf("insert err,seqlist is full\n");
return -1;
}
if(offset < 0 || offset > s->last + 1)//判断插入的位置offset是否有误
{
printf("insert err,err offset\n");
return -1;
}
inti = s->last;//临时变量i保存last;
while(i>= offset)//移动i所标记的元素,后移动的为offset标记位置的元素
{
s->data[i + 1] = s->data[i];
i--;
}
s->data[offset] = value;
s->last++;//让last标记新的末尾元素。
return 1;
}
//删除数据
intseqlistDelete(seqlist_t *s,int offset)
{
if(isEmtpy(s))
{
printf("delete err,seqlist is empty\n");
return -1;
}
if(offset < 0 || offset > s->last)
{
printf("delete err,err offset\n");
return -1;
}
int ret = s->data[offset];
while(offset < s->last)
{
s->data[offset] = s->data[offset + 1];
offset++;
}
s->last--;
return ret;
}
//查看顺序表
void seqlistShow(seqlist_t *s)
{
inti = 0;
while(i<= s->last)
{
printf("%d ",s->data[i]);
i++;
}
}
主函数用于测试:
#include "seqlist.h"
intmain()
{
seqlist_t *s = seqlistCreate();
seqlistInesert(s,1,0);
seqlistInesert(s,2,1);
seqlistInesert(s,3,2);
seqlistInesert(s,4,3);
seqlistInesert(s,5,4);
seqlistShow(s);
puts("");
seqlistDelete(s,4);
seqlistShow(s);
puts("");
return 0;
}