一、顺序表
顺序表是逻辑线性,存储线性的表结构。连续存储在构造元素结构体中是利用数组实现。同时,定义元素结构体时定义元素下标。
1、定义元素的结构体
#include <stdio.h>
#define data_t int
#define SIZE 128
typedef struct list
{
data_t data[SIZE];//顺序表通过数组实现连续存储
int inode;//定义顺序表的元素的下标
}LIST;
int main(void)
{
return 0;
}
2、顺序表开辟空间
//顺序表开辟空间
#include <stdlib.h>
#include <strings.h>
LIST * createSeqlist(void)
{
LIST * p = (LIST *)malloc(sizeof(LIST));//malloc函数的作用是在堆区开辟空间
if(NULL == P) //malloc函数的头文件为#include <stdlib.h>
{
return NULL;//函数出错时指针类型返回NULL
}
bzero(p->data,sizeof(p->data));//bzero函数的作用清空数组内容,头文件为#include <strings.h>
p->inode = -1;//记录最后一个元素的下标,-1表示表空
return p; //返回结构体指针类型
}
3、顺序表判满
//顺序表判空
int seqlistIsFull(LIST *p)
{
if(NULL != p)
return ((p->inode+1 == SIZE) ? 1 : 0);//因为当表满时,最后一个元素的下标为SIZE-1.返回类型为
else //整形,表满则返回1,不满返回0
return -1;
}
4、顺序表判空
//顺序表判空
int seqlistIsEmpty(LIST *p)
{
if(NULL != p)
return (p->inode == -1 ? 1 : 0);//当表空时,顺序表没有元素,最后一个元素的下标为-1。返回类型
else //也为int型,表空返回1,表不空返回0
return -1;
}
5、计算表中元素个数
//计算表中元素个数
int getSeqlistLength(LIST *p)
{
if(NULL == p)
return -1;
else
return (p->inode+1);//最后一个元素下标+1就是顺序表的元素个数
}
6、顺序表添加元素
int insertSeqlistByPos(LIST *p,int pos,data_t data)
{
//顺序表判满,若满则无法添加元素,程序退出
if(seqlistIsFull(p))
return -1;
/*判断元素添加位置的合法性,若位置小于0号位置或者大于表长(可以在最后一个元素后面添加位置,所以
位置上限是最后一个元素后一个位置即表长),则无法添加元素,退出程序*/
int len = getSeqlistLength(P)
if(pos<0 || pos >len)
return -1;
/*从最后一个元素开始循环往右移,原来pos位置的元素当然也要往右移所以for循环判断取等号,最后将
data赋给pos位置的元素值*/
for(int i=len-1;i>=pos;i--)
{
p->data[i+1] = p->data[i];
p->data[pos] = data;
}
/*添加元素成功后,最后一个元素下标加一*/
p->inode++;
return 0;
}