顺序表_主程序

本文详细介绍了如何通过main2-1.cpp文件测试线性表顺序存储结构bo2-1.h的主函数,涉及插入、遍历、查找、删除等操作,并展示了关键函数的使用和表的动态扩展。

顺序表检验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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

用模板方式实现顺序表的合并 #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 bool SeqList ::SLDelete(int i) // 删除表的第i个位置的结点 { if(iLength) {cout <<"参数i不合理!" <<endl; return false;} else if(Length==0) {cout<< "表已空,无无元素可删除!"<<endl; return false;} else{ for(int j=i;j<Length-1;j++)Mylist[j]=Mylist[j+1]; Length--; cout<<"删除操作成功"<<endl; return true; } } template void SeqList ::SLPrint(void) //输出全体元素 { if (SLIsEmpty()) cout<<"空表! 无元素可输出"<<endl; else{ cout<<"顺序表中的所有元素分别为: "; for (int i=0;i<Length;i++) cout<<Mylist[i]<<" "; } cout <<endl; } void ListUnion(SeqList &ListA;,SeqList &ListB;) { cout<<"两个参数对象的顺序表:"<<endl; ListA.SLPrint(); ListB.SLPrint(); int n,m; int XX,i=0; n=ListA.ListLength(); m=ListB.ListLength(); int j=i; while(i<m){ XX=ListB.SLGetElem(i); int k=ListA.SLFind(XX,n); if(k==-1) { ListA.SLInsert(n+j,XX); j++; } i++; } cout<<"两个顺序表合并后的结果"<<endl; ListA.SLPrint(); cout<<"ListUnion end"<<endl; } int main(int argc, char* argv[]) { SeqList myListA(20),myListB(30); int LenA,LenB; cout<>LenA; cout<<endl; myListA.CreateList(LenA); myListA.SLPrint(); cout<<endl<>LenB; cout<<endl; myListB.CreateList(LenB); myListB.SLPrint(); ListUnion(myListA,myListB); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值