顺序表是连续的内存数据结构,查找比较快,缺点是扩展性比较差。
/*******************************************************************************
*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;
}
|