C语言数据结构---顺序表

顺序表是连续的内存数据结构,查找比较快,缺点是扩展性比较差。

/*******************************************************************************
*Complier:VS2017
*Project:SequenceList   顺序表
*Author:Rise
*1、用数组(固定大小) 实现 顺序表  要求有增删改查操作 (使用函数)
********************************************************************************/
#include<vld.h>
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<string.h>

#pragma pack(1)

#define SL_MAX		30
#define NAME_LEN	20

typedef struct sequence
{
	char   name[NAME_LEN];
	unsigned int id;
}SL_Content;

typedef struct SL
{
	SL_Content data[SL_MAX];
	int SLlen;
}SLType;

SL_Content SC_Input(unsigned int id,const char* name)
{
	int len = strlen(name);
	SL_Content node;
	memset(&node, 0, sizeof(SL_Content));
	node.id = id;
	if (len < NAME_LEN)
	{
		strcpy(node.name, name);
		node.name[len] = '\0';
	}
	else
	{
		for (int i = 0; i < NAME_LEN-1; i++)
		{
			node.name[i] = name[i];
		}
		node.name[NAME_LEN - 1] = '\0';
	}
	return node;
}

void SL_Init(SLType* sl)
{
	sl->SLlen = 0;
}

int SL_GetLenght(const SLType* sl)
{
	return sl->SLlen;
}

inline bool SL_IsNullContent(const SL_Content sc)
{
	if (sc.name == NULL && sc.id == 0)
		return true;
	return false;
}

int SL_ReckoLen(const SLType* sl)
{
	int count = 0;
	while (!SL_IsNullContent(sl->data[count]))
	{
		count++;
	}
	return count;
}

bool SL_IsFull(SLType* sl)
{
	if (sl->SLlen >= SL_MAX)
	{
		/*printf("顺序表已满,不能再插入结点!\n");*/
		sl->SLlen = SL_MAX;
		return true;
	}
	return false;
}

int SL_Swap(SLType* sl, int a, int b)
{
	if (!(a >= 0 && a <= sl->SLlen && a <= SL_MAX-1))
		return -2;
	if (!(b >= 0 && b <= sl->SLlen && b <= SL_MAX-1))
		return -2;
	SL_Content tmp = sl->data[a];
	sl->data[a] = sl->data[b];
	sl->data[b] = tmp;
	return 0;
}

int SL_Insert(SLType* sl, int n, SL_Content data)
{
	if (sl->SLlen >= SL_MAX)
	{
		printf("顺序表已满,不能再插入结点!\n");
		return -1;
	}

	if (n<0 || n>SL_MAX-1)
	{
		printf("结点参数错误!\n");
		return -2;
	}

	//检查指定结点是否有数据
	//如果有数据,向后移动一个结点
	//if (sl->data[n].id == 0 || sl->data[n].name == NULL)
	//{
	//	for (int i = sl->SLlen; i >=n; i--)
	//	{
	//		sl->data[i + 1] = sl->data[i];
	//	}
	//}

	sl->data[n] = data;

	return 0;
}

int SL_Delete(SLType* sl, int n)
{
	if (n<0 || n>SL_MAX-1)
	{
		printf("结点参数错误!\n");
		return -2;
	}
	
	sl->data[n].id = 0;
	memset(sl->data[n].name, 0, NAME_LEN);
	return 0;
}

int SL_Add(SLType* sl, SL_Content data)
{
	if (sl->SLlen >= SL_MAX)
	{
		printf("顺序表已满,不能添加结点!\n");
		return -4;
	}
	if (sl->data[sl->SLlen].id == 0 || sl->data[sl->SLlen].name == NULL)
	{
		printf("新结点已被占用!\n");
		return -3;
	}
	sl->data[sl->SLlen] = data;
	sl->SLlen++;
	return 0;
}

SL_Content SL_GetNode(SLType* sl, const int n)
{
	return sl->data[n];
}

int SL_Change(SLType* sl, int n, SL_Content data)
{
	if (n<0 || n>SL_MAX - 1)
	{
		printf("结点参数错误!\n");
		return -2;
	}
	sl->data[n] = data;

	return 0;
}

void SL_ShowAll(SLType* sl)
{
	for (int i = 0; i < sl->SLlen; i++)
	{
		printf("id:%d\tname:%s\n", sl->data[i].id, sl->data[i].name);
	}
}

int main()
{
	SLType sl;
	SL_Init(&sl);
	SL_Content d1 = SC_Input(1001, "Jack");
	SL_Add(&sl, d1);
	d1 = SC_Input(1002, "danny");
	SL_Add(&sl, d1);
	d1 = SC_Input(1003, "Tom");
	SL_Add(&sl, d1);
	SL_ShowAll(&sl);
	printf("Corect:\n");
	d1 = SC_Input(1004, "Peter");
	SL_Insert(&sl, 2, d1);
	SL_ShowAll(&sl);
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Risehuxyc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值