实验一 顺序表

实验一 顺序表

顺序表:在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

数组:把具有相同数据类型的若干变量按有序的形式组织起来,以便于程序处理,这些数据元素的集合就是数组。

从顺序表的定义来看,它和数组确实有很大的联系。首先,它是以数组的形式来保存的,其次,它和数组一样都是存储的元素物理地址相邻,具有很大的相似性。

#include <stdio.h>
#include <malloc.h>
#define ERROR 0
#define OK 1

#define INIT_SIZE 5   /*初始分配的顺序表长度*/
#define INCREM 5      /*溢出时,顺序表长度的增量*/
typedef int ElemType; /*定义表元素的类型*/
typedef struct Sqlist
{
  ElemType *slist; /*存储空间的基地址*/
  int length;      /*顺序表的当前长度*/
  int listsize;    /*当前分配的存储空间*/
} Sqlist;

int InitList_sq(Sqlist *L);                      /*线性表的初始化*/
int CreateList_sq(Sqlist *L, int n);             /*构造一个长度为n顺序表*/
int ListInsert_sq(Sqlist *L, int i, ElemType e); /*在表的第i个位置前插入一个元素e*/
int PrintList_sq(Sqlist *L);                     /*输出顺序表的元素*/
int ListDelete_sq(Sqlist *L, int i);             /*删除第i个元素*/
int ListLocatevalue(Sqlist *L, ElemType e);      /*查找值为e的元素*/
int ListLocatenumber(Sqlist *L, int i);          /*查找序号为i的元素的值*/

int InitList_sq(Sqlist *L) /*线性表的初始化*/
{
  L->slist = (ElemType *)malloc(INIT_SIZE * sizeof(ElemType));
  if (!L->slist)
    return ERROR; //存储分配失败退出
  L->length = 0;  //空表长度为0
  L->listsize = INIT_SIZE;
  return OK;
} /*InitList*/

int CreateList_sq(Sqlist *L, int n) /*构造一个长度为n顺序表*/
{
  ElemType e;
  int i;
  for (i = 0; i < n; i++)
  {
    printf("输入数据第%d个数据:", i + 1);
    scanf("%d", &e);
    if (!ListInsert_sq(L, i + 1, e))
      return ERROR;
  }
  return OK;
} /*CreateList*/

int PrintList_sq(Sqlist *L) /*输出顺序表的元素*/
{
  int i;
  for (i = 1; i <= L->length; i++)
    printf("%5d", L->slist[i - 1]);
  return OK;
} /*PrintList*/

int ListInsert_sq(Sqlist *L, int i, ElemType e) /*在表的第i个位置前插入一个元素e*/
{
  int k;
  if (i < 1 || i > L->length + 1) //i值不合法
    return ERROR;
  if (L->length >= L->listsize) //当前存储空间已满,增加分配
  {
    L->slist = (ElemType *)realloc(L->slist, (INIT_SIZE + INCREM) * sizeof(ElemType));
    if (!L->slist)
      return ERROR;
    L->listsize += INCREM;
  }
  for (k = L->length - 1; k >= i - 1; k--) //元素后移
  {
    L->slist[k + 1] = L->slist[k];
  }
  L->slist[i - 1] = e; //在第i个位置上插入元素e
  L->length++;         //表长加1
  return OK;
} /*ListInsert*/

int ListDelete_sq(Sqlist *L, int i) /*在顺序表中删除第i个元素*/
{
  int j;
  //在顺序表L中删除第i个元素,并用e返回其值
  //i值的合法范围是1<=i<=L.length
  if ((i < 1) || (i > L->length))
    return ERROR;                      //i值不合法
  for (int j = i; j <= L->length; j++) //元素后移
    L->slist[j - 1] = L->slist[j];     //被删除元素之后的元素前移
  --L->length;                         //表长减1
  return OK;
}
/*在顺序表中查找指定值元素,返回其序号*/
int ListLocatevalue(Sqlist *L, ElemType e) /*查找值为e的元素*/
{
  //顺序表的查找
  for (int i = 0; i <= L->length; i++)
  {
    if (L->slist[i - 1] == e)
    {
      printf("%d", i);
      // return i + 1//查找成功,返回序号i+1
    }
    else if (i > L->length)
    {
      printf("无此数据或查找失败!");
      // return 0; //查找失败,返回0
    }
  }
}

int ListLocatenumber(Sqlist *L, int i) /*查找序号为i的元素*/
{
  int e;
  for (int j = 0; j <= L->length; j++)
    if (j == i - 1)
    {
      e = L->slist[j];
      printf("%d", e);
      // return e; //查找成功,返回e
    }
    else if (i > L->length)
    {
      printf("无此数据或查找失败!");
      // return 0; //查找失败,返回0
    }
  // return 0; //查找失败,返回0
}

int main()
{
  Sqlist sl;
  printf("1. 建立\n");
  printf("2. 输入\n");
  printf("3. 按序号查找\n");
  printf("4. 按值查找\n");
  printf("5. 插入\n");
  printf("6. 删除\n");
  printf("7. 输出\n");
  printf("0. 退出\n");
  printf("*. 如果非正常退出,表示没有数据存储\n\n");
  int n = 0;       //元素数量
  int i = 0;       //序号
  int e;           //元素值
  int m, k;        //插入时的序号和数据
  int j;           //删除的值的序号
  int choose = -1; //选择
  while (choose != 0)
  {
    printf("\n请输入要操作的选项编号:");
    scanf("%d", &choose); //检测输入的choose

    switch (choose)
    {
    case 1: //创建顺序表
      printf("第一个功能:建立顺序表");
      printf("1-输入顺序表的元素个数n:"); /*输入顺序表的元素个数*/
      scanf("%d", &n);
      if (n > 0)
      {
        printf("成功创建一个元素数量为%d的顺序表!\n", n);
      }
      else
      {
        printf("\n输入的数量数值有问题,请重新进入选项输入。");
        break;
      }
      break;
    case 2: //顺序表信息输入
      printf("第二个功能:输入顺序表的值");
      if (n > 0)
      {
        printf("1-您创建的顺序表可以储存%d个数据!\n", n);
        printf("2-请输入顺序表的数据:\n");
        InitList_sq(&sl);      /*线性表的初始化*/
        CreateList_sq(&sl, n); /*构造一个长度为n顺序表,这里会输入数据*/
        printf("3-您输入的顺序表元素如下:\n");
        PrintList_sq(&sl); //输出顺序表的元素
      }
      break;
    case 3: //使用序号查询顺序表
      printf("第三个功能:使用序号查询顺序表");
      printf("1-请输入一个序号用来查找值:");
      scanf("%d", &i);
      if (i > 0)
      {
        printf("2-您查找的序号的值为:");
        ListLocatenumber(&sl, i);
      }
      else
      {
        printf("\n输入的数值有问题,请重新进入选项输入。\n");
      }
      break;
    case 4: //使用值查询顺序表
      printf("第四个功能:使用值查询顺序表");
      printf("1-请输入一个值用来查找序号::\n");
      scanf("%d", &e);
      if (e != ' ')
      {
        printf("2-您查找的值的序号为:");
        ListLocatevalue(&sl, e);
      }
      else
      {
        printf("\n输入的数值有问题,请重新进入选项输入。\n");
      }
      break;
    case 5: //顺序表的插入
      printf("第五个功能:插入值到顺序表");
      printf("1-您的顺序表如下:\n");
      PrintList_sq(&sl); //输出顺序表的元素
      printf("\n2-请输入插入的位置和数据:\n");
      printf("位置,数据\n");
      scanf("%d,%d", &m, &k);
      ListInsert_sq(&sl, m, k);
      printf("3-您的新的顺序表如下:\n");
      PrintList_sq(&sl); //输出顺序表的元素
      break;
    case 6: //顺序表的删除
      printf("第六个功能:从顺序表中删除值");
      printf("1-您的顺序表如下:\n");
      PrintList_sq(&sl); //输出顺序表的元素
      printf("\n2-请输入删除的值的位置:");
      scanf("%d", &j);
      ListDelete_sq(&sl, j);
      printf("\n3-您的新的顺序表如下:\n");
      PrintList_sq(&sl); //输出顺序表的元素
      break;
    case 7: //顺序表的输出
      printf("第七个功能:顺序表的输出");
      printf("1-您的顺序表如下:\n");
      PrintList_sq(&sl); //输出顺序表的元素
      break;
    }
  }
}

用于教学作用,优化于此博主https://blog.csdn.net/weixin_30719711/article/details/98868048
至于代码根源,并未追溯。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值