数据结构 实验一 顺序表的操作

一、顺序表的操作

任务一:初始化一个顺序表并输出。
相关知识
需要掌握:
1.结构体变量初始化
2.如何遍历顺序表。
结构体变量初始化:
定义结构体变量的同时,给结构体变量的各个成员变量赋值。
示例如下:
sequenlist sq={{1,3,6,7},3};
{1,3,6,7}是给结构体中的数组赋值,
3.给成员变量 last 赋值
遍历顺序表
给定一个顺序表L,从0~L->last,依次输出,就可以遍历完顺序表中的所有元素。
其中L是指向顺序表的指针。
示例如下:
void listprint (sequenlist L) /输出线性表/
{
int i;
for(i=0;i<=(L).last;i++)
printf(“%d “,L->vec[i]);
}
输出:1 3 6 7
示例代码如下:(温馨提示:本文全部代码只在 EduCoder 平台上通过测试,仅供参考,如有运行错误请自行改正)

#define MAXSIZE 100    /*宏定义*/
#define OK 1
#define OVERFLOW -2
#include "stdio.h"    /*包含输入输出文件*/

typedef int elemtype;
typedef struct          /*定义顺序表的结构*/
{
    elemtype vec[MAXSIZE]; /*顺序表数据成员所占据的存储空间*/
    int last;              /*顺序表中最后一个元素在数组中的下标(或向量中的位置)从0开始*/
}sequenlist;

 void listprint(sequenlist *L) /*输出线性表*/
 {
 /*请在下面补充代码,输出顺序表*/
 for(int i=0;i<=(*L).last;i++)
 printf("%d ",L->vec[i]);
 }
  int main()
 {
  sequenlist sl={{1,3,6,10,15,21,28,36,45},8};//直接给顺序表赋初值
  listprint(&sl);
  return 0;
}

任务二:顺序表上的查找操作
相关知识
需要掌握:
1.如何写完整函数定义
2.如何进行查找
函数定义
格式:
函数类型 函数名(形参列表)
{…}
函数类型不为空时,函数要用return返回一个值。

查找算法
采用顺序查找算法,从顺序表的一端开始,按顺序比较当前数组元素与给定值K是不是相等,若相等,则表示查找成功,返回元素在数组中的下标;
当比较完最后一个元素仍然不相等,则返回-1,表示查找失败。

测试说明
平台会对你编写的代码进行测试:

测试输入:45
预期输出:
查找成功,该元素在数组中的下标是9

测试输入:30
预期输出:
查找失败
示例代码如下:

#define MAXSIZE 100    
#define OK 1
#define OVERFLOW -2

#include "stdio.h"    

typedef int elemtype;
typedef struct          
{elemtype vec[MAXSIZE]; 
 int last;             
}sequenlist;

/*请在下面写出查找函数的原型。提示:根据主函数处的函数调用判断函数名、函数类型、参数类型*/
int locate(sequenlist *L, int key)
{
	int i=0;
	int result=-1;
	L->vec[10]=key;
	while(i!=10)
	{
		if(L->vec[i]==key)
		{
			result=i;
			break;
		}
		i++;
	}
	return result;
}

 void listprint(sequenlist *L) 
 {int i;
  for(i=0;i<=(*L).last;i++)
  printf("%d ",L->vec[i]);
 }

 int main()
 {
  sequenlist sl={{1,3,6,10,15,21,28,36,45},8};
  int key;
  int result;  /*保存查找结果的变量*/
  scanf("%d",&key);
  result=locate(&sl,key);
  if(result!=-1) printf("查找成功!该元素在数组中的下标是%d",result);
  else printf("查找失败!");
  return 0; 
}

任务三:顺序表的插入、删除操作
任务描述:
编写一个程序实现顺序表的插入删除操作。
相关知识
需要掌握:
1.顺序表的插入操作
2.顺序表的删除

顺序表的插入
insert(L,i,x)
在顺序表L的第i个位置上插入元素x
需要注意:
1、顺序表表满的情况
2、插入位置i的范围 0<i<=L->next+2(n+1)
3、L->last++

顺序表的删除
dele(L,i)
删除顺序表L的第i个元素。
需要注意
1、删除位置i 0<i<=L->last+1
2、L->last–

测试说明
平台会对你编写的代码进行测试:
please input the insert position and insert value
3 44
the insert position: 3
insert value:44
i,e=0,1
i,e=1,2
i,e=2,44
i,e=3,3
i,e=4,4
i,e=5,5
i,e=6,6
i,e=7,7
i,e=8,8
i,e=9,9
i,e=10,10
please intput the delete position:5
i,e=0,1
i,e=1,2
i,e=2,44
i,e=3,3
i,e=4,5
i,e=5,6
i,e=6,7
i,e=7,8
i,e=8,9
i,e=9,10

#define MAXSIZE 100    
#define OK 1
#define OVERFLOW -2
#include "stdio.h"    

typedef int elemtype;
typedef struct          
{elemtype vec[MAXSIZE]; 
 int last;              
}sequenlist;

/****************请写出插入函数定义******************************/
int insert(L,i,x)
sequenlist *L;
int i,x;
{
	int j;
	if( ( (*L).last >= MAXSIZE-1)) 
	{
	printf("overflow");
	return 0; 
	} /*表空间溢出*/
	else 
	if ( (i<=0) || ( i> (*L).last+1 ))
	{
	printf("error");
	return 0;
	}
	else
	{
		for(j=(*L).last ; j>=i-1 ; j-- )
		(*L).vec[j+1]=(*L).vec[j];  //结点后移
		(*L).vec[i-1]=x;
		(*L).last=(*L).last+1;//终端结点下标加1
	}

	return (1);

}

/*****************请写出删除函数定义*****************************/
int dele(L,i)
sequenlist *L;
int i;
{
	int j;
	if ((i<0)||(i>(*L).last))
	{
	return 0;
	}
	else 
	{
		for (j=i;j<=(*L).last;j++)

		L->vec[j-1]=L->vec[j];

	}
	L->last--;
	return (1);

}

 void listprint(sequenlist *L) /*输出线性表*/
 {int i;
  for(i=0;i<=(*L).last;i++)
  printf("i,e=%d,%d\n",i,L->vec[i]);
 }

 int main()
 {
  sequenlist sl={{1,2,3,4,5,6,7,8,9,10},9};
  int i,j,x;
  elemtype e;
  printf("please input the insert position and insert value\n");
  scanf("%d%d",&i,&x);
  printf("the insert position: %d\ninsert value:%d\n",i,x);
  insert(&sl,i,x);
  listprint(&sl);
  printf("please intput the delete position:\n");
  scanf("%d",&j);
  dele(&sl,j);A
  listprint(&sl);
  return 0;
}

任务四
任务描述:逆置一个顺序表并输出。
相关知识
需要掌握:1.如何逆置顺序表

逆置顺序表
从两端开始,将顺序表对称元素交换。
设置两个对称的指针i,j;
i=0;
j=L->last;
while(i<j)
{ 交换i,j下标处的元素;
i++;
j–;
}

测试说明
平台会对你编写的代码进行测试:
测试输入:
预期输出:
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1

#define MAXSIZE 100    
#define OK 1
#define OVERFLOW -2
#include "stdio.h"    

typedef int elemtype;
typedef struct          
{elemtype vec[MAXSIZE]; 
 int last;              
}sequenlist;

/*请在下面写出逆置函数的原型函数。*/
void inverse(sequenlist *L)
{
	int i=0;
	for (i=0;i<= L-> last/2;i++)
	{
		L->vec[i]= L->vec[i]+L->vec[L->last-i];
		L->vec[L->last-i]=L->vec[i]- L->vec[L->last-i];
		L->vec[i]= L->vec[i]- L->vec[L->last-i];
	}
	
}

 void listprint(sequenlist *L) /*输出线性表*/
 {int i;
  for(i=0; i<=(*L).last;i++)
  printf("%d ",L->vec[i]);
  printf("\n");
 }

 int main()
 {
  sequenlist sl={{1,2,3,4,5,6,7,8,9,10},9};
  int i,j,x;
  listprint(&sl);
  inverse(&sl);
  listprint(&sl);
  return 0;
}

任务五
任务描述:有序顺序表中元素的插入
相关知识
需要掌握:
1.如何进行有序顺序表的插入

先求出插入位置 i
为了保持有序性,插入位置不能随意指定。必须在指定位置进行插入
假设顺序表升序
插入元素为x
从表头开始(i=0),将L->vec[i]依次与x比较,如果x比表中元素大,则i++继续比较;
否则,找到插入位置 i ,跳出循环。

实现在位置 i 处的插入操作
给定了插入位置和待插入元素,就是普通的插入操作

编程要求:
实现有序顺序表中元素的插入

测试说明
平台会对你编写的代码进行测试:

测试输入:8
预期输出:
1 3 5 7 8 10

测试输入:12
预期输出:1 3 5 7 10 12

测试输入 0
预期输出:0 1 3 5 7 10

#define MAXSIZE 100    
#define OK 1
#define OVERFLOW -2
#include "stdio.h"    

typedef int elemtype;
typedef struct          
{elemtype vec[MAXSIZE]; 
 int last;              
}sequenlist;

void order_insert(sequenlist *L,elemtype x)
{
	int i=0,j;
	while(i<L->last+1 && x>=L->vec[i]) i++;
	for(j=L->last;j>=i-1;j--)
	L->vec[j+1]=L->vec[j];
	L->vec[i]=x;
	L->last++;
}

 void listprint(sequenlist *L) /*输出线性表*/
 {int i;
  for(i=0;i<=(*L).last;i++)
  printf("%d ",L->vec[i]);
 }

 int main()
 {
  sequenlist sl={{1,3,5,7,10},4};
  int x;
  scanf("%d",&x);
  order_insert(&sl,x);
  listprint(&sl);
  return 0;
}

我把我目前写的关于数据结构 题目 的链接全部汇总整理在下面,有需要的小伙伴自己点击哈。

实验:

关于顺序表的操作的实验内容就写到这了。
如果觉得内容对你有帮助的话,可以点个赞再走吗,Thanks♪(・ω・)ノ

  • 23
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值