听说你也想学数据结构Day16 20240718

一、顺序表的相关练习

1.顺序表的创建与释放和增删改查

1>seqlist.h

#ifndef SEQLIST_H		//防止头文件被重复调用展开
#define SEQLIST_H
#include <myhead.h>

#define MAX 100			//顺序表最大长度

typedef int datetype;	//顺序表元素数据类型重定义

//定义数据表并进行数据类型重定义
typedef struct
{
	datetype date[MAX];		//存放顺序表数据元素的数组
	int len;				//顺序表当前长度
}Seqlist, *SeqlistPtr;    	//类型重定义名称

//顺序表各种操作函数声明

//创建顺序表
SeqlistPtr seqlistCreate();

//顺序表判空
int seqlistEmpty(SeqlistPtr L);

//顺序表判满
int seqlistFull(SeqlistPtr L);

//添加元素
int seqlistAdd(SeqlistPtr L, datetype e);

//遍历打印
int seqlistPrint(SeqlistPtr L);

//按位置插入
int seqlistInserPos(SeqlistPtr L, int pos, datetype e);

//任意位置删除
int seqlistDeletePos(SeqlistPtr L, int pos);

//按值查找
int seqlistSearchValue(SeqlistPtr L, datetype e);

//按位置修改
int seqlistUpdatePos(SeqlistPtr L, int pos, datetype e);

//按值修改
int seqlistUpdateValue(SeqlistPtr L, datetype old_e, datetype new_e);

//顺序表释放
int seqlistFree(SeqlistPtr *L);

#endif

2>seqlist.c

#include "seqlist.h"

//顺序表各种操作函数定义
//创建顺序表
SeqlistPtr seqlistCreate()
{
	SeqlistPtr L = (SeqlistPtr)malloc(sizeof(Seqlist));		//创建顺序表"L",并在堆区申请相应空间
	//判断是否创建成功
	if( L == NULL)
	{
		printf("创建失败\n\n");
		return NULL;
	}
	//顺序表初始化
	memset(L->date, 0, sizeof(L->date));
	L->len = 0;  		//初始化长度为0

	printf("创建成功\n\n");
	
	return L;
}

//顺序表判空
int seqlistEmpty(SeqlistPtr L)
{
	//判断逻辑:顺序表长度==0则空
	return L->len == 0;
}

//顺序表判满
int seqlistFull(SeqlistPtr L)
{
	//判断逻辑:顺序表长度==MAX则满
	return L->len == MAX;
}

//添加元素
int seqlistAdd(SeqlistPtr L, datetype e)
{
	//判断合法性和是否已满
	if(L==NULL || seqlistFull(L))
	{
		printf("元素添加失败\n\n");
		return -1;
	}

	//向len位中添加元素
	L->date[L->len] = e;
	L->len++;					//表长度+1

	printf("元素添加成功\n\n");
	return 0;
}

//遍历打印
int seqlistPrint(SeqlistPtr L)
{
	//判断合法性和是否为空
	if(L==NULL || seqlistEmpty(L))
	{
		printf("元素打印失败\n\n");
		return -1;
	}
	
	//遍历打印,首位-->len-1位
	for(int i=0; i<L->len; i++)
	{
		printf("%d\t", L->date[i]);
	}
	putchar(10);

	printf("元素打印完成\n\n");
	
	return 0;
}

//按位置插入
int seqlistInserPos(SeqlistPtr L, int pos, datetype e)
{
	//判断合法性和是否还有余位插入
	if(L==NULL || seqlistFull(L) || pos<0 || pos>L->len)
	{
		printf("元素插入失败\n\n");
		return -1;
	}

	//插入位至末位整体向后偏移一位
	for(int i=L->len-1; i>=pos; i--)
	{
		L->date[i+1] = L->date[i];
	}
	//将元素插入pos位
	L->date[pos] = e;
	L->len++;					//插入完成,长度+1

	printf("元素插入成功\n\n");

	return 0;
}

//任意位置删除
int seqlistDeletePos(SeqlistPtr L, int pos)
{
	//判断合法性和是否可删除元素
	if(L==NULL || seqlistEmpty(L) || pos<0 || pos>=L->len)
	{
		printf("元素删除失败\n\n");
		return -1;
	}
	
	//将pos+1位至末位整体向前偏移1位
	for(int i=pos; i<L->len; i++)
	{
		L->date[i] = L->date[i+1];
	}
	L->len--;					//删除完成,长度-1

	printf("元素删除成功\n\n");
	
	return 0;
}

//按值查找
int seqlistSearchValue(SeqlistPtr L, datetype e)
{
	//判断合法性和是否为空
	if(L==NULL || seqlistEmpty(L))
	{
		printf("元素查找失败\n\n");
		return -1;
	}

	//遍历查找相同值
	for(int i=0; i<L->len; i++)
	{
		if(L->date[i] == e)
		{
			printf("元素查找成功\n\n");
			return i;				//查找成功,返回查找值下标
		}
	}

	printf("查找不到元素\n\n");

	return -1;
}

//按位置修改
int seqlistUpdatePos(SeqlistPtr L, int pos, datetype e)
{
	//判断合法性和是否为空
	if(L==NULL || seqlistEmpty(L) || pos<0 || pos>=L->len)
	{
		printf("元素修改失败\n\n");
		return -1;
	}
	//直接在pos位修改元素
	L->date[pos] = e;

	printf("元素修改成功\n\n");

	return 0;
}

//按值修改
int seqlistUpdateValue(SeqlistPtr L, datetype old_e, datetype new_e)
{
	//判断合法性和是否为空
	if(L==NULL || seqlistEmpty(L))
	{
		printf("元素修改失败\n\n");
		return -1;
	}

	//调用查找函数找值
	int res = seqlistSearchValue(L, old_e);
	
	//查找成功,直接在res位插入新值 
	if(res != -1)
	{
		seqlistUpdatePos(L, res, new_e);
		printf("元素修改成功\n\n");
		return 0;
	}

	printf("查找不到元素\n\n");

	return -1;
}

//顺序表释放
int seqlistFree(SeqlistPtr *L)
{
	//判断合法性
	if(*L == NULL)
	{
		printf("释放失败\n\n");
		return -1;
	}

	free(*L);
	*L = NULL;

	printf("释放成功\n\n");
	
	return 0;
}

3>main.c

#include "seqlist.h"

int main(int argc, const char *argv[])
{
	//创建顺序表
	SeqlistPtr L = seqlistCreate();

	//添加元素
	seqlistAdd(L, 520);
	seqlistAdd(L, 1314);
	seqlistAdd(L, 100);
	seqlistAdd(L, 2014);

	//打印
	seqlistPrint(L);

	//插入元素
	seqlistInserPos(L, 3, 2013);

	//打印
	seqlistPrint(L);

	//删除元素
	seqlistDeletePos(L, 2);

	//打印
	seqlistPrint(L);

	//按值查找
	seqlistSearchValue(L, 2013);

	//按位置修改
	seqlistUpdatePos(L, 3, 3344);

	//打印
	seqlistPrint(L);

	//按值修改
	seqlistUpdateValue(L, 3344 ,2014);

	//打印
	seqlistPrint(L);

	//释放顺序表
	seqlistFree(&L);

	//打印测试是否释放成功
	seqlistPrint(L);
	
	return 0;
}

4>程序运行效果截图

二、数据结构相关知识思维导图

1.数据

2.结构

3.线性表

4.顺序表

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值