顺序表的实现(数据结构)

(1)实验目的

通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,培养学生编写程序时,要考虑程序的健壮性,全面考虑问题,熟练掌握通过函数参数返回函数结果的办法。

(2)实验内容

编程实现顺序表下教材第二章定义的线性表的基本操作,并根据已经实现的基本操作(函数),通过调用函数,实现两个非递减有序的线性表的合并,注意,合并时,如果有重复的元素(一个表内部的重复元素和两个表之间的重复元素),请保留一个。

(3)实验要求

(a)求前驱是指,输入一个元素值(而不是位置),求该元素在顺序表中的直接前驱元素值。求后继是指:输入一个元素值(而不是位置),求该元素在顺序表中的直接后继元素值;(b)为了方便修改数据元素的类型,请使用类型重定义,可以方便修改线性表中的数据元素的类型;(c)大部分函数的返回结果应是函数执行是否成功的一种状态,执行成功了,才返回具体的结果值;(d)对每个功能进行测试时,要求把不合法的情况也测试一下。具体见下面的测试用例;(e)采用菜单形式对应各个操作,使其编成一个完整的小软件,参考界面如下。注意:程序运行过程中菜单不要做成刷屏的效果,测试过的数据不要清除,这样方便截图和查看。

顺序表的实现(数据结构)_第1张图片

注:

销毁是指free(L.elem);   L.elem=NULL;  L.length=0; L.listsize=0; return TRUE。

清空是指:L.length=0 ;return TRUE。

(4)验收/测试用例

通过菜单调用各个操作,测试点:

  1. 没有初始化前进行其他操作,程序是否能控制住;即,如果没有初始化线性表,其他的功能是无法正常进行的,如果选择进行其他操作,要提示先进行初始化;
  2. 先选择菜单1,初始化一个顺序表(初始化顺序表,是指初始化一个空的线性表,里面的元素个数是0);
  3. 选择菜单10,插入数据(位置, 数据),要测插入位置不合法的情况如:(0,1)、(2,1),正确插入3个数据(1,20)、(1,10)、(3,30);
  4. 显示顺序表中的数据,屏幕输出10, 20, 30;
  5. 判空,屏幕输出顺序表非空;
  6. 输出顺序表长度,屏幕输出3;
  7. 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况都要测试,非法的情况要做出合理的提示;
  8. 定位,输入:40, 输出:不存在,输入20,输出位置为2;
  9. 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;输入10,输出:第一个元素没有前驱,输入20,输出前驱是10,输入40,输出该元素不存在;
  10. 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;同上求前驱;
  11. 删除,要测位置在【1,3】范围之外的情况和之内的情况,非法的情况要做出合理的提示;
  12. 清空操作后再测长度,判断是否为空;清空后,测试菜单6到11的功能,看是否能够正确提示。
  13. 销毁顺序表,销毁线性表之后还能不能做插入,删除等操作,如果选其他操作,就要提示线性表已经销毁不存在;
  14. 测试合并操作,第一个线性表中的元素是(2,3,3,4,5),第二个线性表中的内容是(1,4,5,6,6,7),合并后的结果,请输出
#include
#include  
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
using namespace std;
typedef struct{
	int *elem;
	int length;
	int listsize;
}SqList;
bool initList(SqList &L){
		L.elem=(int * )malloc(LIST_INIT_SIZE*sizeof(int));
		if(! L.elem)cout<<"分配失败"<0){
		if(i>0&&i<=L.length){
			e=L.elem[i-1];
			cout<>e;
	int i;
	for(i=0;ielem)cout<<"该表已销毁"<1&&i<=L->length){
		cout<<"前驱为"<elem[i-2];
		cout<elem)cout<<"该表已销毁"<0&&ilength){
			cout<<"后继为"<elem[i];
			cout<0)&&(i<=L->listsize)){
		if(L->length==L->listsize){
			int *newbase=(int * )realloc(L->elem, (LIST_INIT_SIZE+LISTINCREMENT)*sizeof(int));
			if(!newbase)cout<<"存储分配失败"<elem[m];
			}
			newbase[i-1]=e;
			for(m=i;mlength+1;m++){
				newbase[m]=L->elem[m-1];
			}
			L->elem=newbase;
			L->listsize=LIST_INIT_SIZE+LISTINCREMENT;
			L->length=L->length+1;
			cout<<"插入成功"<<"\n";
		}else {
			int m;
			
			for(m=L->listsize-1;m>=i;m--){
				L->elem[m]=L->elem[m-1];
			}
			
			L->elem[i-1]=e;
L->length=L->length+1;
			cout<<"插入成功"<<"\n";
		}	
	}else cout<<"输入错误"<<"\n";
}
void delate(SqList &L,int i,int &e){
	if(i>0&&i<=L.length){
		int m;
		if(i==L.length)
        {
	    L.length=L.length-1;
	    cout<<"删除成功"<L2.elem[j]){
			L.elem[k]=L1.elem[i];
			++i;
		}else{
			L.elem[k]=L2.elem[j];
			++j;
		}
		++k;
	}
	//这段 代码是用于合并两个有序列表L1和L2的函数,结果存储在列表L中。代码首先定义了三个指针(i, j, k),并设置它们都为0。然后,它进入一个循环,在这个循环中,它会比较L1和L2的当前元素(i和j索引的元素)。如果L1的当前元素大于L2的当前元素,它会将L1的当前元素添加到L中,然后增加i的值。否则,它会将L2的当前元素添加到L中,并增加j的值。一旦循环结束,任何剩余的元素(在L1或L2中)将被添加到结果列表L中。注意,这个函数假设列表L有足够的空间来存储合并后的元素。
	if(i==L1.length){
		for(int m=j;m>choice;
	switch(choice) {
		case 1:
		initList(L);
		break;
		case 2:
			destroy(L);
			break;
		case 3:
			clear(L);
			break;
		case 4:
			jud(L);
			break;
		case 5:
			cout<<"长度是"<>i;
			Getelem(L,i,e);
			break;
		case 7:
			int e;
			Getload(L,e);
			break;
		case 8:
			cout<<"输入第几个位置"<>i;
			front(&L,i,e);
			break;
		case 9:
			cout<<"输入第几个位置"<>i;
			behind(&L,i,e);
			break;
		case 10:
			cout<<"输入位置"<>i;
			cin>>e;
			insert(&L,i,e);
			break;
		case 11:
			cout<<"输入删除元素的位置"<>i;
			delate(L,i,e);
			break;
		case 12:
			display(L);
			break;
		case 13:
			int n;
			cout<<"输入L1的元素个数"<>n;
			initList(L1);
			for(int k=0;k>i;
				cin>>e;
				insert(&L1,i,e);
			}
			cout<<"输入L2的元素个数"<>n;
				initList(L2);
				for(int k=0;k>i;
							cin>>e;
							insert(&L2,i,e);
						}
			merge(L1,L2,L);
			break;
		default:
			if(choice<0){
				cout<<"程序已结束";
				break;
			}
	}
	}
}

顺序表的实现(数据结构)_第2张图片

你可能感兴趣的:(数据结构/算法,数据结构)