顺序表的基本操作-----------------实验一

顺序表的要求:

编写算法实现下列问题的求解。

  1. 在第i个结点位置插入值为x的结点。

实验测试数据基本要求:1 2 3 4 5 6 7 8 9 10

第一组数据:顺序表长度n≥10,x=100,  i分别为5,n,n+1,0,1,n+2

第二组数据:顺序表长度n=0,x=100,i=5

  1. 删除顺序表中第i个元素结点。

实验测试数据基本要求:

第一组数据:顺序表长度n≥10,i分别为5,n,1,n+1,0

第二组数据:顺序表长度n=0, i=5

  1. 在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性。

实验测试数据基本要求:10 20 30 40 50 60 70 80 90 100

顺序表元素为 (10,20,30,40,50,60,70,80,90,100),

x分别为25,85,110和8

  1. 将顺序表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),分别放入新的顺序表中,然后原表和新表元素同时输出到屏幕上,以便对照求解结果。

实验测试数据基本要求:

第一组数据:顺序表元素为 (1 2 3 4 5 6 7 8 9 10 20 30 40 50 60)

第二组数据:顺序表元素为 (10 20 30 40 50 60 70 80 90 100)

  1. 求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中。

实验测试数据基本要求:

第一组

第一个顺序表元素为 (1 3 6 10 15 16 17 18 19 20)

第二个顺序表元素为 (1 2 3 4 5 6 7 8 9 10 18 20 30)

第二组

第一个顺序表元素为 (1 3 6 10 15 16 17 18 19 20)

第二个顺序表元素为 (2 4 5 7 8 9 12 22)

第三组

第一个顺序表元素为 ()

第二个顺序表元素为 (1,2,3,4,5,6,7,8,9,10)

  1. 删除递增有序顺序表中的重复元素,并统计移动元素次数,要求时间性能最好。

实验测试数据基本要求:

第一组数据:顺序表元素为 (1 2 3 4 5 6 7 8 9)

第二组数据:顺序表元素为 (1 1 2 2 2 3 4 5 5 5 6 6 7 7 8 8 9)

第三组数据:顺序表元素为 (1 2 3 4 5 5 6 7 8 8 9 9 9 9 9)

 算法实现部分;

#include<iostream>
#pragma once
using namespace std;
#define MAXLEN 100
typedef int elementType;
typedef struct sList
{
	elementType data[MAXLEN];//定义储存表中的元素数组
	int listLen;//定义表的长度
}seqList;


//函数声明
void create(seqList* L);//创建链表
void initList(seqList* L);//链表初始化
void print(seqList* L);//遍历顺序表,并输出
void menoprint();//菜单输出
int listInsert(seqList* L, int i, elementType x);//1.在第i个结点前插入值为x的结点
int listDelete(seqList* L, int i);//2.删除顺序表中第i个元素结点。
void OrderlistInsert(seqList* L, int x);//3.在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性
void  listseparate(seqList* L1, seqList* L2, seqList* L3);//4.将顺序表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),分别放入新的顺序表中,然后原表和新表元素同时输出到屏幕上,以便对照求解结果。
void listcommon(seqList* L, seqList* L1, seqList* L2); //5.求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中。
void listdeleteReapt(seqList* L);//6.删除递增有序顺序表中的重复元素,并统计移动元素次数


//函数实现
//创建链表
void create(seqList* L)
{
	int i = 0;
	cin >> i;
	while (i != -1)
	{
		L->data[L->listLen] = i;
		L->listLen++;
		cin >> i;
	}
}

//链表初始化
void initList(seqList* L)
{
	L->listLen = 0;
}

//遍历链表,并输出
void print(seqList* L)
{
	int i;
	for (i = 0; i < L->listLen; i++)
	{
		cout << L->data[i] << " ";
	}
	cout << endl;
}


//菜单输出
void menoprint()
{
	cout << "******************************************************************************************************" << endl;
	cout << "**		输入0或-1退出程序                                                                   **" << endl;
	cout << "**		输入1创建链表                                                                       **" << endl;
	cout << "**		输入2初始化链表                                                                     **" << endl;
	cout << "**		输入3遍历并显示链表                                                                 **" << endl;
	cout << "**		输入4插入元素                                                                       **" << endl;
	cout << "**		输入5删除第i个位置元素                                                              **" << endl;
	cout << "**		输入6在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性。           **" << endl;
	cout << "**		输入7将顺序表L中的奇数项和偶数项结点分解开                                         **" << endl;
	cout << "**		输入8求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中                     **" << endl;
	cout << "**		输入9删除递增有序顺序表中的重复元素,并统计移动元素次数                             **" << endl;
	cout << "******************************************************************************************************" << endl;
}

//1.在第i个结点前插入值为x的结点。
int listInsert(seqList* L,int i,elementType x)
{
	int j;
	if (i == MAXLEN)
	{
		cout << "链表已满" << endl;
		return 0;
	}
		
	else if (i<1 || i>L->listLen + 1)
	{
		cout << "输入的插入位置不正确" << endl;
		return 1;
	}
		
	else
	{
		for (j = L->listLen - 1; j >= i - 1; j--)
		{
			L->data[j + 1] = L->data[j];
		}
		L->data[i - 1] = x;
		L->listLen++;
		return 2;
	}
}

//2.删除顺序表中第i个元素结点。
int listDelete(seqList* L, int i)
{
	int j;
	if (L->listLen <= 0)
	{
		cout << "输入的位置不正确" << endl;
		return 0;

	}
		
	else if (i > L->listLen || i <= 0)
	{
		cout << "输入的位置不正确" << endl;
		return 1;
	}
	else
	{
		for (j = i; j <= L->listLen - 1; j++)
		{
			L->data[j-1] = L->data[j];
		}
		L->listLen--;
		return 2;
	}
}


//3.在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性。
void OrderlistInsert(seqList* L, int x)
{
	int i =0;
	if (L->listLen == MAXLEN)
		cout << "链表已满" << endl;
	while (L->data[i] <= x)
	{
		if (i == L->listLen)
		{
			break;
		}
		else
		{
			i++;
		}
	}
	listInsert(L, i+1, x);
}


//4.将顺序表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),分别放入新的顺序表中,然后原表和新表元素同时输出到屏幕上,以便对照求解结果。
void  listseparate(seqList* L, seqList* L1, seqList* L2)
{
	int k = 0, i = 0, j = 0;
	for (i = 0; i < L->listLen; i++)
	{
		if (L->data[i] % 2)
		{
			while (j != L->listLen)
			{
				L1->data[j] = L->data[i];
				L1->listLen++;
				j++;
				break;
			}
		}
		else
		{
			while (k != L->listLen)
			{
				L2->data[k] = L->data[i];
				L2->listLen++;
				k++;
				break;
			}
		}
	}
}


//5.求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中。
void listcommon(seqList* L1, seqList* L2, seqList* L3)
{
	int i = 0, p = 0, q = 0;
	while (p != L1->listLen && q != L2->listLen)
	{
		if (L1->data[p] == L2->data[q])
		{
			while (i != L1->listLen)
			{
				L3->data[i] = L1->data[p];
				L3->listLen++;
				break;
			}
			i++;
			q++;
			p++;
		}
		else if (L1->data[p] < L2->data[q])
			p++;
		else
			q++;
	}
}


//6.删除递增有序顺序表中的重复元素,并统计移动元素次数
void listdeleteReapt(seqList*L) {
	//删除有序表重复值
	int same = 0;
	for (int i = 0; i < L->listLen; i++)
	{
		for (int j = i + 1; j < L->listLen; j++) {
			if (L->data[i] == L->data[j])
			{
				same++;
			}
			else {
				L->data[j - same] = L->data[j];
			}
		}
		L->listLen = L->listLen- same;
	}
	cout << "移动次数" << same << endl;
}

算法测试部分:

#include"squlist.h"
int main()
{
	int j, i = 100;
	int x;
	seqList L, L1, L2, L3;
	initList(&L);
	initList(&L1);
	initList(&L2);
	initList(&L3);
	while (i != -1)
	{
		menoprint();
		cin >> i;
		switch (i)
		{
		case 0:
			exit(0);
		case 3:
			cout << "链表为:";
			print(&L);
			break;
		case 4:
			cout << "请输入插入的位置" << endl;
			cin >> j;
			cout << "请输入插入元素:" << endl;
			cin >> x;
			if (listInsert(&L, j, x)!=2)
			{

			}
			else
			{
				cout << "插入后的链表" << endl;
				print(&L);
			}
			break;
		case 5:
			cout << "请输入要删除的元素位置" << endl;
			cin >> j;
			if (listDelete(&L, j)!=2)
			{

			}
			else
			{
				cout << "删除元素的链表为" << endl;
				print(&L);
			}
			break;
		case 6:
			/*initList(&L);
			cout << "提示  输入-1结束" << endl;
			cout << "请输入顺序表数据" << endl;
			create( & L);*/
			cout << "原表为:" << endl;
			print(&L);
			cout << "请输入插入的元素" << endl;
			cin >> x;
			OrderlistInsert(&L, x);
			cout << "插入后的链表" << endl;
			print(&L);
			//initList(&L);
			break;
		case 7:
			//initList(&L);
			initList(&L1);
			initList(&L2);
			//cout << "提示  输入-1结束" << endl;
			//cout << "请输入顺序表L数据:(提示  输入-1结束)" << endl;
			//create(&L);
			cout << "表L为:" << endl;
			//print(&L);
			listseparate(&L, &L1, &L2);
			cout << "链表L1为:";
			print(&L1);
			cout << "链表L2为:";
			print(&L2);
			//initList(&L);
			break;
		case 8:
			initList(&L1);
			initList(&L2);
			initList(&L3);
			cout << "请输入递增有序顺序表L1数据:(提示  输入-1结束)" << endl;
			create(&L1);
			cout << "请输入递增有序顺序表L2数据:(提示  输入-1结束)" << endl;
			create(&L2);
			listcommon(&L1, &L2, &L3);
			cout << "表L3" << endl;
			print(&L3);
			break;
		case 9:
			/*cout << "提示  输入-1结束" << endl;
			cout << "请输入递增有序顺序表L数据:" << endl;
			create(&L);*/
			cout << "原表为:";
			print(&L);
			listdeleteReapt(&L);
			cout << "删除重复的元素后表" << endl;
			print(&L);
			break;
		case 1:
			cout << "请输入递增有序顺序表L数据:(提示  输入-1结束)" << endl;
			create(&L);
			cout << "数据成功录入" << endl;
			break;
		case 2:
		{
			initList(&L);
			cout << "\n初始化\n" << endl;
			break;
		}
		}
		system("pause");
		system("cls");
	}
	return 0;
	system("pause");
}

实验结果展示:

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验目的: 1.熟悉线性表的概念和基本操作。 2.掌握线性表的顺序存储和链式存储方式,并能够进行相应的操作。 3.设计和实现基于线性表的图书信息管理系统。 实验内容: 1.线性表的概念和基本操作 线性表是由n个数据元素(a1,a2,……an)组成的有限序列,其中n为表长,当n=0时,称为空表。 线性表的基本操作包括:初始化、插入、删除、查找、遍历等。 2.线性表的顺序存储 线性表的顺序存储方式是将线性表中的元素按其逻辑顺序依次存放在一段连续的存储单元中,称为顺序表顺序表基本操作包括:初始化、插入、删除、查找、遍历等。 3.线性表的链式存储 线性表的链式存储方式是将线性表中的元素存放在任意的存储单元中,通过指针将各个存储单元连接起来,称为链表链表基本操作包括:初始化、插入、删除、查找、遍历等。 4.图书信息管理系统 图书信息管理系统是一种基于线性表的应用,主要用于管理图书信息。 图书信息管理系统的功能包括:添加图书信息、删除图书信息、查找图书信息、修改图书信息、显示图书信息等。 实验步骤: 1.设计数据结构,包括图书信息结构体、顺序表结构体、链表结构体等。 2.实现顺序表基本操作,包括初始化、插入、删除、查找、遍历等。 3.实现链表基本操作,包括初始化、插入、删除、查找、遍历等。 4.设计和实现图书信息管理系统,包括添加图书信息、删除图书信息、查找图书信息、修改图书信息、显示图书信息等功能。 5.测试和调试系统,确保系统能够正常运行。 实验总结: 本次实验主要学习了线性表的概念和基本操作,掌握了线性表的顺序存储和链式存储方式,并设计和实现了基于线性表的图书信息管理系统。通过本次实验,我深入了解了线性表的原理和应用,提高了数据结构的编程能力和实践能力,为以后的学习和应用打下了基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值