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

论坛 期权论坛 脚本     
已经匿名di用户   2022-4-26 15:50   2940   0

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

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP