桂电七院数据结构实验报告一

顺序表的基本操作

实验内容与步骤
实现顺序表上的插入、删除等操作。调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。加深对有关算法的理解。
步骤:
第一步:定义顺序表的存储结构。
第二步:编写顺序表操作的具体函数定义。
第三步:使用定义的顺序表并调用顺序表的一些操作,实现具体运算。
具体函数的定义有:
1) insert(L,i,x)在顺序表的第i个元素之前插入一个新元素x.
2) delete (L,i) 删除顺序表的第i个元素。
3) listprint(L) 输出顺序表。

在DEVC++中,stdio.h包含了delete函数,所以需要对原有定义的delete函数进行修改,这里我改成了deleter;在DEVC++中在声明函数后面要直接说明数据类型,例如void listprint(sequenlist *L),不能按指导书上的代码直接写,不然会报错在这里插入图片描述
这是最原来的代码输入后报错的图片
在这里插入图片描述
这里是我修改后的,代码如下

#define MAXSIZE 100    /*宏定义*/
#define OK 1
#define OVERFLOW -2

#include "stdio.h"    /*包含输入输出文件*/

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

int insert(sequenlist *L,int i,elemtype x) { /*在顺序表的第i个元素之前插入一个新元素x*/
	int j;
	if(((*L).last)>=MAXSIZE-1) {
		printf("the list is overflow!\n");
		return(0); /*溢出判断*/
	} else if((i<1)||(i>(*L).last+2)) {
		printf("position is not correct!\n");
		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;/*修改last的值*/
	}
	return(1);
}
void deleter(sequenlist *L,int i) { /*删除顺序表的第i个元素*/
	int j;
	if((i<1)||(i>(*L).last+1))
		printf("delete fail\n");
	else {
		for(j=i; j<=(*L).last; j++)
			(*L).vec[j-1]=(*L).vec[j];/*前移元素,覆盖掉要删除元素的值*/
		(*L).last--;  /*修改last的值*/
	}
}

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

main() {
	sequenlist sl= {{1,2,3,4,5,6,7,8,9,10},9}; //直接给顺序表赋初值
	sequenlist *L;/*定义一个指向顺序表类型的指针变量*/
	int i,j,x;
	elemtype e;
	L=&sl; /*给指针变量赋值*/
	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(L,i,x);
	listprint(L);
	printf("please intput the delete position:");
	scanf("%d",&j);
	deleter(L,j);
	listprint(L);
}

预习思考题

1) 定义一个定位函数locate(L,x),具有元素检索的功能。当顺序表中存在一个值为x的数据元素时,返回第一次找到的数据元素的位序,否则,给出一个值,表示值为x的元素不存在。在主程序中调用该函数,分析操作结果。
这里locate写的是按值查找,实际上相当于C语言中的在数组中按值查找位置,操作较为简单,这里我把不需要的地方都打了注释,代码及运行效果如下:

`#define MAXSIZE 100    /*宏定义*/
#define OK 1
#define OVERFLOW -2
#include "stdio.h"    /*包含输入输出文件*/
typedef int elemtype;
typedef struct {        /*定义顺序表的结构*/
	elemtype vec[MAXSIZE]; /*顺序表数据成员所占据的存储空间*/
	int last;              /*顺序表中最后一个元素在数组中的下标(或向量中的位置)从0开始*/
} sequenlist;
int locate(sequenlist L,int x) {
	int i,a=-1;
	for(i=0; i<=(L).last; i++) {
		if(x==(L).vec[i]) {
			a=i;
			break;
		}
	}
	return a;
}
int insert(sequenlist L,int i,elemtype x) { /*在顺序表的第i个元素之前插入一个新元素x*/
	int j;
	if(((L).last)>=MAXSIZE-1) {
		printf("the list is overflow!\n");
		return(0); /*溢出判断*/
	} else if((i<1)||(i>(L).last+2)) {
		printf("position is not correct!\n");
		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;/*修改last的值*/
	}
	return(1);
}
void deleter(sequenlist L,int i) { /*删除顺序表的第i个元素*/
	int j;
	if((i<1)||(i>(L).last+1))
		printf("delete fail\n");
	else {
		for(j=i; j<=(L).last; j++)
			(L).vec[j-1]=(L).vec[j];/*前移元素,覆盖掉要删除元素的值*/
		(L).last--;  /*修改last的值*/
	}
}
void listprint(sequenlist L) { /*输出线性表*/
	int i;
	for(i=0; i<=(L).last; i++)
		printf("i,e=%d,%d\n",i,L->vec[i]);
}
main() {
	sequenlist sl= {{1,2,3,4,5,6,7,8,9,10},9}; //直接给顺序表赋初值
	sequenlist L;/*定义一个指向顺序表类型的指针变量*/
	int i,j,x,k,y;
	elemtype e;
	L=&sl; /*给指针变量赋值*/
	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(L,i,x);
	listprint(L);
	printf("please intput the delete position:");
	scanf("%d",&j);
	deleter(L,j);
	listprint(L);
	printf("输入定位数值");
	scanf("%d",&k);
	y=locate(L,k);
	if(y==-1)
		printf("查找不出来\n");
	else printf("该数值的位置是%d\n",y);
}

在这里插入图片描述
我们显然可以看出来数值1在数组的第一个,位置也就是0,;数值0找不出来,所以输出查找不出来

2)定义一个逆置函数diverse(L),把顺序表进行逆置。在主程序中调用该函数,分析操作结果。
逆置也就是输入两个表示下标的i,j,一个从前往后遍历,一个从后往前遍历,这两者表示的数组中的数字一直互换,直到两者相等的时候就停下,代码及运行效果如下

#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 diverse(sequenlist *L) {
	int i=0,j=L->last,t;
	while(i<j) {
		t=L->vec[i];
		L->vec[i]=L->vec[j];
		L->vec[j]=t;
		i++;
		j--;
	}
}
void listprint(sequenlist *L) { /*输出线性表*/
	int i;
	for(i=0; i<=(*L).last; i++)*
		printf("i,e=%d,%d\n",i,L->vec[i]);
}
main() {
	sequenlist sl= {{1,2,3,4,5,6,7,8,9,10},9}; //直接给顺序表赋初值
	sequenlist *L;/*定义一个指向顺序表类型的指针变量*/
	L=&sl;
	printf("逆置前的表为\n");
	listprint(L);
	diverse(L);
	printf("逆置后的表为\n");
	listprint(L);
}

在这里插入图片描述
为了方便阅读和观看,我对最开始的代码进行了较大调整

3) 定义一个函数delsame(L),把顺序表中重复的元素删除掉,只保留一个。在主程序中调用该函数,分析操作结果。
这里我们还是比较容易想到的,从第一个数开始,用剩下的数去跟它比较;在这次循环结束后,再从第二个数开始,以此类推,若有相同的数字删去即可。为了方便代码的调试,我把表中的数据进行了改动,代码及运行效果如下:

#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 deleter(sequenlist *L,int i) { /*删除顺序表的第i个元素*/
	int j;
	if((i<1)||(i>(*L).last+1))
		printf("delete fail\n");
	else {
		for(j=i; j<=(*L).last; j++)
			(*L).vec[j-1]=(*L).vec[j];/*前移元素,覆盖掉要删除元素的值*/
		(*L).last--;  /*修改last的值*/
	}
}
void delsame(sequenlist *L)
{
	int i,j;
	for(i=0;i<L->last;i++)
		for(j=i+1;j<=L->last;)
			{
			if(L->vec[i]==L->vec[j])
				deleter(L,j+1);
				else j++;
				}
}
void listprint(sequenlist *L) { /*输出线性表*/
	int i;
	for(i=0; i<=(*L).last; i++)
		printf("i,e=%d,%d\n",i,L->vec[i]);
}
main() {
	*sequenlist sl= {{1,1,3,4,5,6,7,8,9,10},9}; //直接给顺序表赋初值*
	*sequenlist *L;/*定义一个指向顺序表类型的指针变量*/*
	*L=&sl;
	printf("删除相同元素前\n");
	listprint(L);
	delsame(L);
	printf("删除相同元素后\n");
	listprint(L);
}

在这里插入图片描述
这里我们可以看到相同的数字1已经删去了

以上就是第一次数据结构实验报告

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 桂林电子科技大学创建FTP服务器是为了进行计算机网络实验。FTP(文件传输协议)是一种用于在网络上传输文件的协议,它能够实现简单、高效和可靠的文件传输。 在计算机网络实验中,FTP服务器的创建可以提供实验所需的数据文件、软件等资源,方便学生们进行实验操作和数据传输。通过搭建FTP服务器,学生们可以在实验室的计算机上通过FTP客户端登录服务器,实现文件的上传和下载。 此外,桂林电子科技大学创建FTP服务器还能够提供便捷的远程访问服务。学生们可以利用FTP客户端在校外通过互联网连接到FTP服务器,方便地获取实验所需的资料和软件。这样,不论是在校内还是校外,学生们都可以方便地进行实验和学习。 桂林电子科技大学创建FTP服务器的过程中,需要考虑服务器的安全性和稳定性。服务器应设置合理的访问权限和认证机制,确保只有授权的用户可以访问服务器并进行上传下载操作。此外,服务器应具备良好的稳定性和可靠性,以保证学生们在实验过程中不会因服务器故障而受到影响。 总而言之,桂林电子科技大学通过创建FTP服务器为计算机网络实验提供了便捷的文件传输和远程访问服务。这样的服务不仅方便了学生们的实验学习,也为他们提供了更广阔的学习空间和学习资源。 ### 回答2: 桂林电子科技大学创建FTP服务器是为了在计算机网络实验中提供一个安全、高效的文件传输和共享平台。 FTP(File Transfer Protocol)是一种用于在计算机网络上进行文件传输的标准协议。它通过建立客户端和服务器之间的连接,实现文件的上传、下载、删除以及目录的创建和修改等功能。创建FTP服务器可以提供快速、稳定的文件传输服务,方便学生和教师在实验中共享和交流相关实验数据、文档和代码等。 首先,创建FTP服务器可以提供安全的文件传输环境。通过设置账号和密码登录验证机制,只有经过授权的用户才能访问服务器中的文件。同时,可以使用SSL/TLS等加密协议确保数据传输的机密性和可靠性,避免数据被窃听和篡改。 其次,创建FTP服务器可以提高文件传输效率。FTP支持并行传输,即多个文件可以同时上传或下载,提高了传输速度。而且,FTP服务器支持断点续传功能,即在传输过程中断开连接后,可以从断点处继续传输,避免重新传输文件,节省时间和带宽资源。 此外,创建FTP服务器还可以方便地管理文件和目录。可以创建不同的用户账号和权限,实现对不同文件的访问控制。可以创建各种目录,便于组织、分类文件,使文件的查找和管理更加方便。 总而言之,桂林电子科技大学创建FTP服务器是为了提供一个安全、高效的文件传输和共享平台,方便实验中的学生和教师进行数据交流和文件管理。同时,通过FTP服务器的创建和使用,使得计算机网络实验的进行更加便捷和高效。 ### 回答3: 桂林电子科技大学创建ftp服务器是为了进行计算机网络实验。FTP服务器(File Transfer Protocol)是一种用于在计算机网络上进行文件传输的协议,通过FTP服务器,用户可以通过网络传输文件,实现文件的上传和下载。 在计算机网络实验中,创建FTP服务器具有以下作用和意义: 1. 文件传输:FTP服务器可以提供一个可靠的文件传输平台,使实验室的师生可以通过网络传输实验数据和文件,方便实验结果的收集和保存。 2. 实验数据共享:通过FTP服务器,实验室的师生可以共享实验数据和文件,方便教师和学生之间的交流和合作。教师可以将教学资料和实验指导文件上传到FTP服务器供学生下载,学生也可以将实验报告和数据上传到服务器与教师及其他同学分享。 3. 远程访问:创建FTP服务器使得实验室的师生能够通过网络远程访问服务器上的文件,无需亲自前往实验室进行操作。这对于一些需要频繁访问实验数据的实验室师生来说十分便利。 4. 数据备份与恢复:FTP服务器可以作为实验室数据的备份平台,及时备份实验数据和文件,保证数据的安全性和完整性。当实验室发生数据丢失或损坏时,可以通过FTP服务器上的备份文件进行数据恢复。 总之,桂林电子科技大学创建FTP服务器为实验室的师生提供了一个高效、便捷和安全的文件传输平台,在计算机网络实验中起到了重要的作用。通过FTP服务器的应用,实验室师生能够更好地进行实验数据的管理、共享和备份,提高了实验教学的效率和质量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值