顺序表的基本操作

这篇博客介绍了如何使用C语言实现顺序表的基本操作,包括初始化、查找、插入和删除等。通过示例代码展示了顺序表的结构和相关算法,帮助读者理解和掌握线性表的顺序存储结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验名称  顺序表的基本操作

一、实验目的:

1、复习C语言程序设计中的知识。

2、掌握线性表的顺序存储结构的表示和实现方法。

3、掌握顺序表基本操作的算法实现。

二、实验内容:

1.建立顺序表。

2.在顺序表上实现插入、删除和查找等操作。

三、实验要求:

编写实现顺序表的基本算法(初始化、查找、插入、删除等)的函数,并在此基础上设计一个主程序完成如下功能:

⑴初始化字符型顺序表L;

⑵建立顺序表L,如(a,b,c,d,c);

⑶输出顺序表L的长度;

⑷输出顺序表L的第i个元素,如第3个元素;

⑸输出给定元素的位置,如输出元素a的位置;

⑹在第i个元素前插入给定元素,如在第4个元素前插入元素f;

⑺删除顺序表L的第i个元素,如删除顺序表L的第3个元素。

四、实验步骤:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define maxsize 1024

typedef int elemtype;

typedef struct sequlist

{

elemtype data[maxsize]; //定义顺序表为一维数组

int last; //last为最后一个数据元素的下标位置

}SequenList;

//1 初始化字符型顺序表L

SequenList * lnit_SequenList()

{

SequenList *L;

L = (SequenList
*)malloc(sizeof(SequenList));/申请分配内存空间/

if (L != NULL) /申请分配内存空间成功/

{

  L->last = -1;      /*顺序表为空*/

  printf("初始化成功!\n");

}

return L; //返回顺序表的首地址

}

/*2 建立顺序表L */

SequenList *indata_SeqList(SequenList *L)

{

elemtype x;

scanf("%d", &x);

while (x != 0)

{

  L->last += 1;

  L->data[L->last] = x;

  scanf("%d", &x);

}

printf(“顺序表建立成功!\n”);

return L;

}

/3 输出顺序表L的长度/

int SequenList_Length(SequenList *L)

{

return (L->last + 1);

}

/* 4 输出顺序表L的第i个元素*/

int input_SequenList(SequenList *L, elemtype key)

{

int i;

for (i = 0; i <= L->last;
i++)

{

  if (i + 1 == key)

  {

     printf("顺序表L的第i个元素为:%d\n", L->data[i]);

     //printf("%d",

L->data[i]);

     //return L->data[i];

  }

}

if (key<=0 || key>(L->last))

{

  printf("查找失败");

}

printf(“顺序表的所有元素为:\n”);

Print_SequenList(L);

return 0;

}

/* 5 输出给定元素的位置 */

int Search_SequenList(SequenList *L, elemtype pos)

{

int i;

for (i = 0; i <= L->last;
i++)

{

  if (L->data[i] == pos)

  {

     printf("给定元素的位置为%d:\n", i + 1);

     //return (i +1);

  }

// if
(pos!=L->data[i] && i = L->last)

  //{

// printf(“查找失败”);

// }

}

Print_SequenList(L);

/* i–;

if (i = L->last
&&(i+1)!=pos)

{

printf(“查找失败”);

}*/

return 0;

}

/* 6 在第i个元素前插入给定元素*/

int lnsert_SequenList(SequenList *L, int i, elemtype x)

/*在顺序表L中第i个数据元素之前插入一个元素e,插入前表长n=L->last+1,

i的合法取值范围是 1<=i<=L->last+2*/

{

int j;

if (L->last >= maxsize - 1)

{

  printf("表已满无法插入");

  return 0;

}

if ((i<1) || (i>L->last +
2))

{

  printf("插入位置i值不合法");

  return -1;

}

/为插入元素而移动位置/

for (j = L->last; j >= i -
1; j–)

{

  L->data[j + 1] =

L->data[j];

}

L->data[i - 1] = x; /第i个元素下标为i-1/

L->last = L->last + 1;

printf(“新数组为:”);

Print_SequenList(L);

return 1;

}

/7 删除顺序表的第i个元素/

int Delete_SequenList(SequenList *L, int i, elemtype *e)

/*在顺序表中删除第i个元素,并用指针参数e返回其值,

i的合法取值范围为1<=i<=L.last+1*/

{

int k;

if ((i<1) || (i>L->last +
1))

{

  printf("删除位置不合法");

  return 0;

}

*e = L->data[i - 1]; /将删除的元素存放到e所指向的变量中/

for (k = i-1; k < L->last;
k++)

{

  L->data[k] = L->data[k +

1];

  //L->last--;

  //Print_SequenList(L);

}

L->last–;

Print_SequenList(L);

return 1;

}

int Print_SequenList(SequenList *L)

{

int i;

if (L->last == -1) /顺序表为空,返回值为0/

{

  return 0;

}

for (i = 0; i <= L->last;
i++)

{

  //printf("顺序表的元素分别为:\n");

  printf("a[%2d]=%3d\t",

i , L->data[i]);

}

return 1;

}

void main()

{

int i;

SequenList *L;

int menu;

int len;

int key;

int pos;

int x;

printf("\n************ 欢迎使用顺序表的基本操作系统 ************\n");

printf("\n************ 1 初始化字符型顺序表L ************\n");

printf("\n************ 2 建立顺序表L ************\n");

printf("\n************ 3 输出顺序表L的长度 ************\n");

printf("\n************ 4 输出顺序表L的第i个元素 ************\n");

printf("\n************ 5 输出给定元素的位置 ************\n");

printf("\n************ 6 在第i个元素前插入给定元素 ************\n");

printf("\n************ 7 删除顺序表的第i个元素 ************\n");

printf("\n************ 8 输出顺序表的所有元素 ************\n");

printf("\n************ 9 退出系统 ************\n");

printf(“请选择1-9:”);

while (1)

{

  scanf("%d",

&menu);

  switch (menu)

  {

  case 1:

  {

          L = lnit_SequenList();

          break;

  } ;

  case 2:

  {

          printf("请输入元素(终止输入请输入0即可):");

           indata_SeqList(L);

          break;

  };

  case 3:

  {

          len = SequenList_Length(L);

          printf("顺序表的长度为:%d\n", len);

          break;

  };

  case 4:

  {

          printf("输出顺序表L的第i个元素  :");

          scanf("%d", &key);

          input_SequenList(L, key);

          break;

  };

  case 5:

  {

          printf("输出给定元素的位置  :");

          scanf("%d", &pos);

          Search_SequenList(L, pos);

          break;

  };

  case 6:

  {

          printf("在哪个元素前插入元素?\n");

          scanf("%d", &i);

          printf("插入的元素为:");

          scanf("%d", &x);

          lnsert_SequenList(L, i, x);

          break;

  };

  case 7:

  {

          printf("请输入所需删除的元素编号:");

          scanf("%d", &i);

          Delete_SequenList(L, i,&i);

          break;

  };

  case 8:

  {

          Print_SequenList(L);

          break;

  };

  case 9:

  {

          printf("按任意键返回主菜单!\n");

          break;

  };

  default:printf("\n 没有此功能,重新输入\n");

     break;

  }

}

}

五、实验结果:

一、实验目的:

1、复习C语言程序设计中的知识。

2、掌握线性表的顺序存储结构的表示和实现方法。

3、掌握顺序表基本操作的算法实现。

二、实验内容:

1.建立顺序表。

2.在顺序表上实现插入、删除和查找等操作。

三、实验要求:

编写实现顺序表的基本算法(初始化、查找、插入、删除等)的函数,并在此基础上设计一个主程序完成如下功能:

⑴初始化字符型顺序表L;

⑵建立顺序表L,如(a,b,c,d,c);

⑶输出顺序表L的长度;

⑷输出顺序表L的第i个元素,如第3个元素;

⑸输出给定元素的位置,如输出元素a的位置;

⑹在第i个元素前插入给定元素,如在第4个元素前插入元素f;

⑺删除顺序表L的第i个元素,如删除顺序表L的第3个元素。

四、实验步骤:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define maxsize 1024

typedef int elemtype;

typedef struct sequlist

{

elemtype data[maxsize]; //定义顺序表为一维数组

int last; //last为最后一个数据元素的下标位置

}SequenList;

//1 初始化字符型顺序表L

SequenList * lnit_SequenList()

{

SequenList *L;

L = (SequenList
*)malloc(sizeof(SequenList));/申请分配内存空间/

if (L != NULL) /申请分配内存空间成功/

{

  L->last = -1;      /*顺序表为空*/

  printf("初始化成功!\n");

}

return L; //返回顺序表的首地址

}

/*2 建立顺序表L */

SequenList *indata_SeqList(SequenList *L)

{

elemtype x;

scanf("%d", &x);

while (x != 0)

{

  L->last += 1;

  L->data[L->last] = x;

  scanf("%d", &x);

}

printf(“顺序表建立成功!\n”);

return L;

}

/3 输出顺序表L的长度/

int SequenList_Length(SequenList *L)

{

return (L->last + 1);

}

/* 4 输出顺序表L的第i个元素*/

int input_SequenList(SequenList *L, elemtype key)

{

int i;

for (i = 0; i <= L->last;
i++)

{

  if (i + 1 == key)

  {

     printf("顺序表L的第i个元素为:%d\n", L->data[i]);

     //printf("%d",

L->data[i]);

     //return L->data[i];

  }

}

if (key<=0 || key>(L->last))

{

  printf("查找失败");

}

printf(“顺序表的所有元素为:\n”);

Print_SequenList(L);

return 0;

}

/* 5 输出给定元素的位置 */

int Search_SequenList(SequenList *L, elemtype pos)

{

int i;

for (i = 0; i <= L->last;
i++)

{

  if (L->data[i] == pos)

  {

     printf("给定元素的位置为%d:\n", i + 1);

     //return (i +1);

  }

// if
(pos!=L->data[i] && i = L->last)

  //{

// printf(“查找失败”);

// }

}

Print_SequenList(L);

/* i–;

if (i = L->last
&&(i+1)!=pos)

{

printf(“查找失败”);

}*/

return 0;

}

/* 6 在第i个元素前插入给定元素*/

int lnsert_SequenList(SequenList *L, int i, elemtype x)

/*在顺序表L中第i个数据元素之前插入一个元素e,插入前表长n=L->last+1,

i的合法取值范围是 1<=i<=L->last+2*/

{

int j;

if (L->last >= maxsize - 1)

{

  printf("表已满无法插入");

  return 0;

}

if ((i<1) || (i>L->last +
2))

{

  printf("插入位置i值不合法");

  return -1;

}

/为插入元素而移动位置/

for (j = L->last; j >= i -
1; j–)

{

  L->data[j + 1] =

L->data[j];

}

L->data[i - 1] = x; /第i个元素下标为i-1/

L->last = L->last + 1;

printf(“新数组为:”);

Print_SequenList(L);

return 1;

}

/7 删除顺序表的第i个元素/

int Delete_SequenList(SequenList *L, int i, elemtype *e)

/*在顺序表中删除第i个元素,并用指针参数e返回其值,

i的合法取值范围为1<=i<=L.last+1*/

{

int k;

if ((i<1) || (i>L->last +
1))

{

  printf("删除位置不合法");

  return 0;

}

*e = L->data[i - 1]; /将删除的元素存放到e所指向的变量中/

for (k = i-1; k < L->last;
k++)

{

  L->data[k] = L->data[k +

1];

  //L->last--;

  //Print_SequenList(L);

}

L->last–;

Print_SequenList(L);

return 1;

}

int Print_SequenList(SequenList *L)

{

int i;

if (L->last == -1) /顺序表为空,返回值为0/

{

  return 0;

}

for (i = 0; i <= L->last;
i++)

{

  //printf("顺序表的元素分别为:\n");

  printf("a[%2d]=%3d\t",

i , L->data[i]);

}

return 1;

}

void main()

{

int i;

SequenList *L;

int menu;

int len;

int key;

int pos;

int x;

printf("\n************ 欢迎使用顺序表的基本操作系统 ************\n");

printf("\n************ 1 初始化字符型顺序表L ************\n");

printf("\n************ 2 建立顺序表L ************\n");

printf("\n************ 3 输出顺序表L的长度 ************\n");

printf("\n************ 4 输出顺序表L的第i个元素 ************\n");

printf("\n************ 5 输出给定元素的位置 ************\n");

printf("\n************ 6 在第i个元素前插入给定元素 ************\n");

printf("\n************ 7 删除顺序表的第i个元素 ************\n");

printf("\n************ 8 输出顺序表的所有元素 ************\n");

printf("\n************ 9 退出系统 ************\n");

printf(“请选择1-9:”);

while (1)

{

  scanf("%d",

&menu);

  switch (menu)

  {

  case 1:

  {

          L = lnit_SequenList();

          break;

  } ;

  case 2:

  {

          printf("请输入元素(终止输入请输入0即可):");

           indata_SeqList(L);

          break;

  };

  case 3:

  {

          len = SequenList_Length(L);

          printf("顺序表的长度为:%d\n", len);

          break;

  };

  case 4:

  {

          printf("输出顺序表L的第i个元素  :");

          scanf("%d", &key);

          input_SequenList(L, key);

          break;

  };

  case 5:

  {

          printf("输出给定元素的位置  :");

          scanf("%d", &pos);

          Search_SequenList(L, pos);

          break;

  };

  case 6:

  {

          printf("在哪个元素前插入元素?\n");

          scanf("%d", &i);

          printf("插入的元素为:");

          scanf("%d", &x);

          lnsert_SequenList(L, i, x);

          break;

  };

  case 7:

  {

          printf("请输入所需删除的元素编号:");

          scanf("%d", &i);

          Delete_SequenList(L, i,&i);

          break;

  };

  case 8:

  {

          Print_SequenList(L);

          break;

  };

  case 9:

  {

          printf("按任意键返回主菜单!\n");

          break;

  };

  default:printf("\n 没有此功能,重新输入\n");

     break;

  }

}

}

五、实验结果:

在这里插入图片描述
在这里插入图片描述

六、实验总结:

顺序表存储位置是相邻连续的,可以随机访问的一种数据结构,一个顺序表在使用前必须指定其长度,一旦分配内存,则在使用中不可以动态的更改。它的优点是访问数据时比较方便,缺点是定义的长度不可更改造成存储空间的浪费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值