一、顺序表的操作
任务一:初始化一个顺序表并输出。
相关知识:
需要掌握:
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;
}
我把我目前写的关于数据结构 题目 的链接全部汇总整理在下面,有需要的小伙伴自己点击哈。
- 数据结构 习题 第一章 概论
- 数据结构 习题 第二章 线性表 (C语言描述)
- 数据结构 习题 第三章 栈和队列 (C语言描述)
- 数据结构 习题 第四章 串 (C语言描述)
- 数据结构 习题 第五章 多维数组和广义表(C语言描述)
- 数据结构 习题 综合复习
实验:
关于顺序表的操作的实验内容就写到这了。
如果觉得内容对你有帮助的话,可以点个赞再走吗,Thanks♪(・ω・)ノ