顺序表所需要功能
1.创建一个空的顺序表
2.指定位置插入数据
3.判断顺序表满
4.遍历顺序表
5.判断顺序表是否为空
6.删除指定位置的数据
7.修改指定位置的数据
8.修改指定的数据(将一个数据修改为新值)
9.查找指定数据的位置
10.查找指定位置的数据
11.清空表
首先创建一个结构体
typedef int datatype;//定义一个数据类型为datatype,方便之后使用
//定义一个顺序表的结构体
typedef struct list_t
{
datatype data[N];//保存数据 顺序表
int last;//保存最后一个有效元素的下标
}seqlist_t ,*seqlist_p;
1.创建一个空的顺序表
seqlist_t *createEmptySeqList(void)
{
seqlist_t *p=NULL;
//创建一个顺序表
p=(seqlist_t *)malloc(sizeof(seqlist_t));
if(NULL == p)
{
printf("malloc err.\n");
return NULL;
}
p->last=-1;//将顺序表赋空
return p;
}
2.指定位置插入数据
第一步,判断插入位置是否正确,同时判断顺序表是否填满(容错处理)
第二步,将指定位置及位置之后的有效元素整体向后移动一个位置
第三步,将数据插入到指定位置
第四步,将有效元素下标加1
int insertPostSeqList(seqlist_t *p,int post,datatype data)
{
int i;
//容错处理
if(post < 0 || post > p->last+1 || isFullSeqList(p))
{
printf("insert err\n");
return -1;
}
//让指定位置及之后的所有有效数据后移一个
for(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;//1(满) 0(非满)
//这里使用的==是判断
//所以返回的值是判断是否成立之后得到的值
//1是条件成立,0是条件不成立
}
4.遍历顺序表
void showSeqList(seqlist_t *p)
{
int i;
for(i=0;i<=p->last;i++)
{
printf("%d ",p->data[i]);
}
putchar(10);
}
5.判断顺序表是否为空
//5.判断顺序表是否为空
int isEmptySeqList(seqlist_t *p)
{
return p->last == -1; //0 非空 1空
//此处原理与isFullSeqList函数一样
}
6.删除指定位置的数据
int delectPostSeqList(seqlist_t *p,int post)
{
int i;
//1.容错处理
if(post < 0||post >p->last || isEmptySeqList(p))
{
printf("delectPostSeqList err.\n");
return -1;
}
//2.将制定位置后的数据前移一个
for(i=post+1;i<=p->last;i++)
{
p->data[i-1]=p->data[i];
}
p->last--;
return 0;
}
7.修改指定位置的数据
int changePostSeqList(seqlist_t *p,int post,datatype data)
{
//1.容错处理
if(post<0||post>p->last || isEmptySeqList(p))
{
printf("changePostSeqList err.\n");
return -1;
}
p->data[post]=data;
return 0;
}
8.修改指定的数据(将一个数据修改为新值)
int changeDataSeqList(seqlist_t *p,datatype old,datatype new)
//定义两个数据变量,一个旧值一个新值
{
int i;
if(isEmptySeqList(p))
{
printf("isEmptySeqList err.\n");
return -1;
}
for(i=0;i<=p->last;i++)
{
if(p->data[i]==old)
p->data[i]=new;
}
return 0;
}
9.查找指定数据的位置
int searchDataSeqList(seqlist_t *p,datatype data)
{
int i;
if(isEmptySeqList(p))
{
printf("isEmptySeqList err.\n");
return -1;
}
for(i=0;i<=p->last;i++)
{
if(p->data[i]==data)
return i;
}
return -1;
}
10.查找指定位置的数据
datatype searchPostSeqList(seqlist_t *p,int post)
{
//容错处理
if(post <0 ||post >p->last || isEmptySeqList(p))
{
printf("searchPostSeqList err.\n");
return -1;
}
return p->data[post];
//返回值查找的位置所存放的数据的值
}
11.清空表
void clearSeqList(seqlist_t *p)
{
p->last=-1;
//此处为逻辑删除,之前输入的值都还在,只是不能再读取和调用
//插入新值时会将原来存储的数据覆盖
}
代码整体为:
seqlist.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#define N 10
typedef int datatype;
//定义一个顺序表的结构体
typedef struct list_t
{
datatype data[N];
int last;//保存最后一个有效元素的下标
}seqlist_t ,*seqlist_p;
//1.创建一个空的顺序表
seqlist_t *createEmptySeqList(void);
//2.指定位置插入数据
int insertPostSeqList(seqlist_t *p,int post,datatype data);
//3.判断顺序表满
int isFullSeqList(seqlist_t *p);
//4.遍历顺序表
void showSeqList(seqlist_t *p);
//5.判断顺序表是否为空
int isEmptySeqList(seqlist_t *p);
//6.删除指定位置的数据
int delectPostSeqList(seqlist_t *p,int post);
//7.修改指定位置的数据
int changePostSeqList(seqlist_t *p,int post,datatype data);
//8.修改指定的数据(将一个数据修改为新值)
int changeDataSeqList(seqlist_t *p,datatype old,datatype new);
//9.查找指定数据的位置
int searchDataSeqList(seqlist_t *p,datatype data);
//10.查找指定位置的数据
datatype searchPostSeqList(seqlist_t *p,int post);
//11.清空表
void clearSeqList(seqlist_t *p);
#endif
seqlist.c
#include <stdio.h>
#include <stdlib.h>
#include "seqlist.h"
//1.创建一个空的顺序表
seqlist_t *createEmptySeqList(void)
{
seqlist_t *p=NULL;
//创建一个顺序表
p=(seqlist_t *)malloc(sizeof(seqlist_t));
if(NULL == p)
{
printf("malloc err.\n");
return NULL;
}
p->last=-1;//将顺序表赋空
return p;
}
//2.指定位置插入数据
int insertPostSeqList(seqlist_t *p,int post,datatype data)
{
int i;
//1.容错处理
if(post < 0 || post > p->last+1 || isFullSeqList(p))
{
printf("insertPostSeqList err.\n");
return -1;
}
//2.让指定位置及之后的所有有效数据后移一个
for(i=p->last;i>=post;i--)
{
p->data[i+1]=p->data[i];
}
//3.插入值
p->data[post]=data;
//4.最后一个有效元素下标加1
p->last++;
return 0;
}
//3.判断顺序表满
int isFullSeqList(seqlist_t *p)
{
return p->last+1==N;//1(满) 0(非满)
}
//4.遍历顺序表
void showSeqList(seqlist_t *p)
{
int i;
for(i=0;i<=p->last;i++)
{
printf("%d ",p->data[i]);
}
putchar(10);
}
//5.判断顺序表是否为空
int isEmptySeqList(seqlist_t *p)
{
return p->last == -1; //0 非空 1空
}
//6.删除指定位置的数据
int delectPostSeqList(seqlist_t *p,int post)
{
int i;
//1.容错处理
if(post < 0||post >p->last || isEmptySeqList(p))
{
printf("delectPostSeqList err.\n");
return -1;
}
//2.将制定位置后的数据前移一个
for(i=post+1;i<=p->last;i++)
{
p->data[i-1]=p->data[i];
}
p->last--;
return 0;
}
//7.修改指定位置的数据
int changePostSeqList(seqlist_t *p,int post,datatype data)
{
//1.容错处理
if(post<0||post>p->last || isEmptySeqList(p))
{
printf("changePostSeqList err.\n");
return -1;
}
p->data[post]=data;
return 0;
}
//8.修改指定的数据(将一个数据修改为新值)
int changeDataSeqList(seqlist_t *p,datatype old,datatype new)
{
int i;
if(isEmptySeqList(p))
{
printf("isEmptySeqList err.\n");
return -1;
}
for(i=0;i<=p->last;i++)
{
if(p->data[i]==old)
p->data[i]=new;
}
return 0;
}
//9.查找指定数据的位置
int searchDataSeqList(seqlist_t *p,datatype data)
{
int i;
if(isEmptySeqList(p))
{
printf("isEmptySeqList err.\n");
return -1;
}
for(i=0;i<=p->last;i++)
{
if(p->data[i]==data)
printf("%d ",i);
}
putchar(10);
return 0;
}
//10.查找指定位置的数据
datatype searchPostSeqList(seqlist_t *p,int post)
{
//容错处理
if(post <0 ||post >p->last || isEmptySeqList(p))
{
printf("searchPostSeqList err.\n");
return -1;
}
return p->data[post];
}
//11.清空表
void clearSeqList(seqlist_t *p)
{
p->last=-1;
}
main.c
#include <stdio.h>
#include "seqlist.h"
int main(int argc, const char *argv[])
{
seqlist_t *p=NULL;
//1.创建空的顺序表
p=createEmptySeqList();
insertPostSeqList(p,0,1);
insertPostSeqList(p,0,2);
insertPostSeqList(p,0,3);
insertPostSeqList(p,0,4);
insertPostSeqList(p,0,5);
//依次从第一个位置插入五个元素
showSeqList(p);
//遍历顺序表
//结果应该为5 4 3 2 1
delectPostSeqList(p,0);
//删除第一个元素
showSeqList(p);
//遍历结果应为4 3 2 1
changePostSeqList(p,3,10);
//将第四个位置的数改为10
showSeqList(p);
//应为4 3 2 10
changeDataSeqList(p,4,2);
//将顺序表中所有的4改为2
showSeqList(p);
//2 3 2 10
searchDataSeqList(p,2);
//查找数据为2的位置
//0 2
printf("%d\n",searchPostSeqList(p,2));
//查找位置为2的数据
//2
clearSeqList(p);
//清空顺序表
showSeqList(p);
//打印结果为空
return 0;
}
Makefile
格式:
目标文件名称:依赖文件名称
tab制表符 命令
a.out:main.o
TAB键 gcc main.c -o main.o
目标的实现,需要通过依赖的文件
可以只有目标没有依赖。
clean:
以上就是没有依赖文件的命令
预定义变量
CC 默认值为cc,与gcc同
RM 默认值为rm -f
CFLAGS 无默认值,一般为c编译器的选项
OBJS 一般为目标文件xx.o
自动变量:
$<
第一个依赖文件的名称
$@
目标文件的完整名称
$^
所有不重复的目标依赖文件,以空格分开
%
匹配所有
CC=gcc
OBJS=main.o seqlist.o
CFLAGS=-c -g -Wall -o
#命令终端只执行make默认执行的事第一个目标对应的命令
seqlist:$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(CFLAGS) $@ $<
.PHONY:clean
#声明伪命令
#防止生成的可执行目标文件与clean相同
clean:
#命令终端执行make clean 执行的是clean目标对应的命令
rm *.o seqlist -f
#-f指的是无论有没有seqlist文件,都会进行删除
结果如下: