目录
一,头文件
头文件中,结构体内定义了一个长度为N的,数据类型为重定义名datatype的一维数组(重定义的原因是,以后如果需要修改数据类型,仅需要修改一处);还有一个存储数组最后一个有效元素的下标的变量last。
last是数组最后一个有效元素下标,post是传入函数的形参,代表要进行操作的位置的下标。
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>
#define N 6
typedef int datatype; //数据类型重定义
typedef struct
{
datatype data[N]; //数组元素内存连续开辟
int last; //最后一个元素下标
}seqlist_t;
//1.创建空的顺序表
seqlist_t *CreateEmptySeqlist(void);
//2.指定位置插入数据
int InsertSeqlist(seqlist_t *p,int post,datatype data);
//3.判断表是否满
int isFullSeqlist(seqlist_t *p);
//4.指定位置删除数据
int DeleteSeqlist(seqlist_t *p,int post);
//5.判断表是否为空
int isEmptySeqlist(seqlist_t *p);
//6.遍历顺序表
void ShowSeqlist(seqlist_t *p);
//7.修改指定位置的值
int ChangePostSeqlist(seqlist_t *p,int post,datatype data);
//8.查询指定位置的值
datatype SearchPostSeqlist(seqlist_t *p,int post);
//9.将指定的值修改为新的值
int ChangeDataSeqlist(seqlist_t *p,datatype old,datatype new);
//10.查询指定值出现的位置
int SearchDataSeqlist(seqlist_t *p,datatype data);
//11.清空顺序表
void ClearSeqlist(seqlist_t *p);
#endif
二,函数代码与解释
1.创建一个空顺序表
函数需要返回结构体类型的地址,所以函数的类型为结构体类型;
首先,定义一个结构体类型的指针p,然后用malloc开辟一个结构体类型的空间,指针p指向空间首地址;
然后,判断空间是否开辟成功,如果指针p等于NULL,则开辟失败;
最后,让数组最后一个有效元素的下标last等于-1,表示数组为空;
返回空间首地址。
//1.创建空的顺序表
seqlist_t *CreateEmptySeqlist(void)
{
//开辟空间
seqlist_t *p = NULL;
p = (seqlist_t *)malloc(sizeof(seqlist_t));
if(NULL == p)
{
printf("CreateEmptySeqlist(void)");
return NULL;
}
//数组为空,最后一个有效元素下标为-1
p->last = -1;
return p;
}
2.指定位置插入数据
向指定位置插入或删除数据的时候,只要涉及到位置,就需要判断这个post下标是否在数组的长度范围内;
首先,需要进行容错判断,也就是判断传入的post是否合理;post不能小于0,不能大于最后一个有效元素的下标+1(因为最后一个元素后面也能插入),且插入时需要判断数组是否满了,也就是说此时的last+1不等于N的话,就可以插入;
然后,将post以及post之后的数据依次向后移动一位,即最后一个有效元素的数据放到下一位的空位里,后面一位的数据被前一位的数据覆盖。
最后,将指定数据赋值给post位置上的元素,last加一。
//2.指定位置插入数据
int InsertSeqlist(seqlist_t *p,int post,datatype data)
{
//容错判断
if(post > p->last+1 || post < 0 || isFullSeqlist(p))
{
printf("InsertSeqlist Fail\n");
return -1;
}
//插入位置及后面的数据依次向后移动一位
for(int i = p->last;i >= post;i--)
{
p->data[i+1] = p->data[i];
}
//插入位置赋值
p->data[post] = data;
//最后一个有效元素下标加1
p->last++;
return 0;
}
3.指定位置删除数据
首先,容错判断,同插入数据时相似,只不过是判断数组是否满变成了判断数组是否为空,即判断last是否等于-1。
然后,删除的顺序和插入的思想相反,插入是后面的元素数据被前面的元素数据覆盖,删除是前面的元素数据被后面的元素数据覆盖;将post及之后的元素都提前一位;
最后,将last减一。
//4.指定位置删除数据
int DeleteSeqlist(seqlist_t *p,int post)
{
//容错判断
if(post < 0 || post > p->last || isEmptySeqlist(p))
{
printf("DeleteSeqlist fail\n");
return -1;
}
//post及后面的数据向前提一位,
//避免超出数组范围,执行语句中不能写为data[i] = data[i+1];
for(int i = post+1;i <= p->last;i++)
{
p->data[i-1] = p->data[i];
}
//最后一个有效元素下标减一;
p->last--;
return 0;
}
三,详细代码
#include "seqlist.h"
//1.创建空的顺序表
seqlist_t *CreateEmptySeqlist(void)
{
seqlist_t *p = NULL;
p = (seqlist_t *)malloc(sizeof(seqlist_t));
if(NULL == p)
{
printf("CreateEmptySeqlist(void)");
return NULL;
}
p->last = -1;
return p;
}
//2.指定位置插入数据
int InsertSeqlist(seqlist_t *p,int post,datatype data)
{
if(post > p->last+1 || post < 0 || isFullSeqlist(p))
{
printf("InsertSeqlist Fail\n");
return -1;
}
for(int i = p->last;i >= post;i--)
{
p->data[i+1] = p->data[i];
}
p->data[post] = data;
p->last++;
return 0;
}
//3.判断表是否满
int isFullSeqlist(seqlist_t *p)
{
return p->last+1 == N;
}
//4.指定位置删除数据
int DeleteSeqlist(seqlist_t *p,int post)
{
if(post < 0 || post > p->last || isEmptySeqlist(p))
{
printf("DeleteSeqlist fail\n");
return -1;
}
for(int i = post+1;i <= p->last;i++)
{
p->data[i-1] = p->data[i];
}
p->last--;
return 0;
}
//5.判断表是否为空
int isEmptySeqlist(seqlist_t *p)
{
return p->last == -1;
}
//6.遍历顺序表
void ShowSeqlist(seqlist_t *p)
{
for(int i = 0;i <= p->last;i++)
{
printf("%d ",p->data[i]);
}
putchar(10);
}
//7.修改指定位置的值
int ChangePostSeqlist(seqlist_t *p,int post,datatype data)
{
if(post < 0 || post > p->last || isEmptySeqlist(p))
{
printf("ChangePostSeqlist fail\n");
return -1;
}
p->data[post] = data;
return 0;
}
//8.查询指定位置的值
datatype SearchPostSeqlist(seqlist_t *p,int post)
{
if(post < 0 || post > p->last || isEmptySeqlist(p))
{
printf("SearchSeqlist fail\n");
return -1;
}
return p->data[post];
}
//9.将指定的值修改为新的值
int ChangeDataSeqlist(seqlist_t *p,datatype old,datatype new)
{
int i;
for(i = 0;i <= p->last;i++)
{
if(p->data[i] == old)
{
p->data[i] = new;
}
}
return 0;
}
//10.查询指定值出现的位置
int SearchDataSeqlist(seqlist_t *p,datatype data)
{
int i;
for(i = 0;i <= p->last;i++)
{
if(p->data[i] == data)
{
return i;
}
}
return -1;
}
//11.清空顺序表
void ClearSeqlist(seqlist_t *p)
{
p->last = -1;
}
如果本文中存在代码逻辑,代码完善,概念解释不通或不清楚的错误,请批评指正。