顺序表_主程序

顺序表检验bo2-1.h的主程序

以下内容为main2-1.cpp

/*
 * 时间:2021.01.30
 * 内容:检验 bo2-1.h 的主函数,也是线性表主要功能检验主函数
 * 位置:
 * 高书p15
 */

#include "c1.h"

typedef int ElemType;	// 定义ElemType为整型

#include "c2-1.h"   //线性表的顺序存储结构
#include "bo2-1.h"  //线性表顺序存储结构的基本操作
#include "fun2-2.h" //包括equal(),comp(),print(),pinrt1()和pirnt2()函数

Status sq(ElemType c1, ElemType c2)
{// 数据元素判定函数(平方关系),LocateElem()调用函数
	
	if(c1 == c2*c2)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

void db1(ElemType & c)
{//ListTraverse()调用的另一函数(元素值加倍)
	
	c *= 2;

	return;
}

void main()
{
	// S:变量声明
	SqList L;
	ElemType e, e0;
	Status i;	// S:状态变量,返回1或0,从而判断函数的状态
	int j,k;	// S:计数变量,用于循环等操作的计数


	// S:初始化
	InitList(L);	// 初始化线性表L

	printf("初始化L后,L.length = %d, L.listsize = %d, L.elem = %u\n", L.length, L.listsize, L.elem);


	// S:插入操作
	for(j = 1; j <= 5; j++)
	{
		i = ListInsert(L, 1, j);	// 在L的表头插入j
	}

	printf("在L的表头依次插入1~5后, *L.elem = ");
	for(j = 1; j <= 5; j++)
	{
		printf("%d", *(L.elem+j-1));	// 依次输出表L中的元素
	}
	/*
	 * 关于*(L.elem+j-1)的理解
	 * *(L.elem+j-1) 等价于 L.elem[j]
	 * 与数组类似
	 * 例如:
	 * int a[3] = {0, 1, 2, 3};
	 * int * q = a;
	 * 则* q 与 a[0]等价, * (q+1) 与 a[1]等价
	 */


	// S:测试遍历输出功能
	printf("\n调用ListTraverse()函数,依次输出表L中的元素:");

	ListTraverse(L, print1);	//依次对表L中的元素调用print1函数(输出元素的值)

	// S:检测表空
	i = ListEmpty(L);	// 检测表L是否空

	printf("L.length = %d, L.listsize = %d(不变),", L.length, L.listsize);
	printf("L.elem = %u(不变),L是否为空?i = %d(1:是 0:否)\n", L.elem, i);


	// S:测试清空表
	ClearList(L);	// 清空表L
	i = ListEmpty(L);	// 再次检测表L是否为空

	printf("清空L后,L.length = %d, L.listsize = %d, ", L.length, L.listsize);
	printf("L.elem = %u, L是否空?i = %d(1:是 0:否)\n", L.elem, i);

	// S:测试表的动态扩充
	for(j = 1; j <= 10; j++)
	{
		ListInsert(L, j, j);	// 在L的表尾插入j
	}
	/*
	 * S:
	 * 对ListInsert(L, j, j);的理解:
	 * 该语句之所以为在表尾插入元素j的原因是
	 * 每次执行ListInsert()函数时都是从j位置进行插入
	 * 而j位置即为动态插入时表的尾元素
	 */
	printf("在L的表尾依次插入1~10后,L = ");
	ListTraverse(L, print1);	// 依次输出表L中的元素
	printf("L.length = %d, L.listsize = %d, L.elem = %u\n", L.length, L.listsize, L.elem);
	// S:至此表已满,下面进行扩充测试
	ListInsert(L, 1, 0);	// 在L的表头插入0,增加储存空间
	printf("在L的表头插入0后,L.length = %d, L.listsize = %d(改变), L.elem = %u(可能改变)\n", L.length, L.listsize, L.elem);

	// S:测试取值功能
	GetElem(L, 5, e);	// 将表L中的第5个元素的值赋给e
	printf("第5个元素的值为%d\n", e);


	// S:测试查找功能
	for(j = 10; j <= 11; j++)
	{
		k = LocateElem(L, j, equal);	// 查找表L中与j相等的元素,并将其位序赋值给k

		if(k)	// k不为0,表明有符合条件的元素
		{
			printf("第%d个元素的值为%d,", k, j);
		}
		else	// k为0,没有符合条件的元素
		{
			printf("没有值为%d的元素\n",j);
		}
	}

	/*
	 * S:
	 * 对该for循环语句的理解
	 * 该语句的作用是测试两个数据
	 * 即j = 10和j = 11时执行相同的测试步骤
	 */

	for(j = 3; j <= 4; j++)	// 测试两个数据
	{
		k = LocateElem(L, j, sq);	//查找表L中与j的平方相等的元素,并将其位序赋值给k

		if(k)	// k不为0,表明有符合条件的元素
		{
			printf("第%d个元素的值为%d的平方", k, j);
		}
		else	// k为0,没有符合条件的元素
		{
			printf("没有值为%d的平方的元素\n", j);
		}
	}


	// S:测试返回前驱功能
	for(j = 1; j <= 2; j++)	// 测试前两个数据
	{
		GetElem(L, j, e0);	// 将表L中的第j个元素的值赋给e0

		i = PriorElem(L, e0, e);	// 求e0的前驱,如成功,将值赋给e

		if(i == ERROR)	// 操作失败
		{
			printf("元素%d无前驱,", e0);
		}
		else
		{
			printf("元素%d的前驱为%d\n",e0 , e);
		}
	}


	// S:测试返回后继
	for(j = ListLength(L) - 1; j <= ListLength(L); j++)	// 最后两个数据
	{
		GetElem(L, j, e0);	// 将表L中的第j个元素的值赋给e0
		i = NextElem(L, e0, e);	// 求e0的后继,如成功,将值赋给e

		if(i == ERROR)	// 操作失败
		{
			printf("元素%d无后继\n", e0);
		}
		else
		{
			printf("元素%d的后继为%d, ", e0, e);
		}
	}



	// S:测试删除元素
	k = ListLength(L);	// k为表长

	for(j = k+1; j >= k; j--)
	{
		i = ListDelete(L, j, e);	//删除第j个数据

		if(i == ERROR)	// 表中不存在第j个数据
		{
			printf("删除第%d个元素失败, ", j);
		}
		else	// 表中存在第j个数据,删除成功,其值赋给e
		{
			printf("删除第%d个元素成功,其值为%d", j, e);
		}
	}

	// S:测试遍历乘二功能
	ListTraverse(L, db1);	// 依次对元素调用db1(),元素值乘2
	printf("L的元素值加倍后,L = ");
	
	ListTraverse(L, print1);	// 依次输出表L中的元素

	// S:测试摧毁功能
	DestroyList(L);	// 销毁表L
	printf("销毁L后, L.length = %d, L.listsize = %d, L.elem = %u\n", L.length, L.listsize, L.elem);


}


运行结果

初始化L后,L.length = 0, L.listsize = 10, L.elem = 9131304
在L的表头依次插入1~5后, *L.elem = 54321
调用ListTraverse()函数,依次输出表L中的元素:54321
L.length = 5, L.listsize = 10(不变),L.elem = 9131304(不变),L是否为空?i = 0(1:是 0:否)
清空L后,L.length = 0, L.listsize = 10, L.elem = 9131304, L是否空?i = 1(1:是 0:否)
在L的表尾依次插入1~10后,L = 12345678910
L.length = 10, L.listsize = 10, L.elem = 9131304
在L的表头插入0后,L.length = 11, L.listsize = 12(改变), L.elem = 9131304(可能改变)
第5个元素的值为4
第11个元素的值为10,没有值为11的元素
第10个元素的值为3的平方没有值为4的平方的元素
元素0无前驱,元素1的前驱为0
元素9的后继为10, 元素10无后继
删除第12个元素失败, 删除第11个元素成功,其值为10
L的元素值加倍后,L = 024681012141618
销毁L后, L.length = 0, L.listsize = 0, L.elem = 0

F:\Personal\数据结构(C语言实现)\严书\VS目录\Data Structure\Debug\Data Structure.exe (进程 18708)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用模板方式实现顺序的合并 #include "stdafx.h" #include #define MaxSize 100 template class SeqList { private: T * Mylist; int ListMaxSize; int Length; public: SeqList(int ListMaxSize=MaxSize); //构造函数 ~SeqList(void);// 析构函数 bool SLIsEmpty(void); // 判断是否为空 bool SLIsFull(void);//判断是否满 int ListLength(void){return Length;}//求长度 T SLGetElem(int i); // 取得第i个元素的值 int SLFind(T & x,int index); //查找值为x的结点 bool SLInsert(int i,T & x); // 在的第i个位置插入新结点 bool SLDelete(int i); // 删除的第i个位置的结点 void CreateList(int num);// 创建一个包含num个元素的顺序 void SLPrint(); //输出全体元素 }; template SeqList ::SeqList(int listMaxSize) //初始化顺序 { if(listMaxSize>0){ ListMaxSize=listMaxSize; Length=0; Mylist=new T [ListMaxSize]; // 创建连续的空间 } } template SeqList ::~SeqList(void) { delete [] Mylist;//删除,释放空间 } template void SeqList ::CreateList(int num) { T x; Length=0; cout << "请输入"<<num<<"个整数数据元素以创建一个线性"<<endl; for (int i=0;i>x; Mylist[i]=x; Length++; } } template bool SeqList ::SLIsEmpty(void) // 判断是否为空 { return (Length<=0)?true:false; //空则返回真(true),否则返回假(false) } template bool SeqList ::SLIsFull(void)//判断是否满 { return(Length>=ListMaxSize)?true:false; //满则返回真(true),否则返回假(false) } template T SeqList ::SLGetElem(int i) // 取得第i个元素的值 { return(iLength-1)?-1:Mylist[i]; } template int SeqList ::SLFind(T & x,int index) //查找值为x的结点 { for(int i=0;i<index;i++) if(Mylist[i]==x) return i+1; return -1;//没有找到给定元素 } template bool SeqList ::SLInsert(int i,T & x) // 在的第i个位置插入新结点 { if(iLength) {cout <<"参数i不合理!" <<endl; return false;} else if(Length==ListMaxSize) {cout<< "已满,无法插入!"<i;j--) Mylist[j]=Mylist[j-1]; Mylist[j]=x; Length++; return true; } } template <clas

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值