当前位置:   article > 正文

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

七院数据结构实验报告

顺序表的基本操作

实验内容与步骤
实现顺序表上的插入、删除等操作。调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。加深对有关算法的理解。
步骤:
第一步:定义顺序表的存储结构。
第二步:编写顺序表操作的具体函数定义。
第三步:使用定义的顺序表并调用顺序表的一些操作,实现具体运算。
具体函数的定义有:
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

预习思考题

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

在这里插入图片描述
我们显然可以看出来数值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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

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

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/590845
推荐阅读
相关标签
  

闽ICP备14008679号