顺序表功能的实现与总结

顺序表所需要功能
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文件,都会进行删除

结果如下:
在这里插入图片描述

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有只小白叫岳飒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值