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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章