数据结构与算法实验1——线性表的应用之顺序表

线性表的应用——顺序表

	                 ————每天八杯水

一、目的要求
1.掌握线性表顺序存储结构的特点。
2.掌握线性表顺序存储结构的常见算法。
二、实验内容
1.输入一组整型元素序列(不少于 10 个),建立顺序表。
2.在该顺序表中进行顺序查找某一元素,查找成功返回 1,否则返回 0。 3.判断该顺序表中元素是否对称,对称返回 1,否则返回 0。 4.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。
5.输入整型元素序列(不少于 10 个),利用有序表插入算法建立一个有序表。
6.利用算法 5 建立两个非递减有序表,并把它们合并成一个非递减有序表。
7.在主函数中设计一个简单菜单,调用上述算法。
三、实验说明

  1. 算法 1 至算法 6 的有关函数用头文件方式存储,主函数包含该头文件。
  2. 存储定义
    const int MAXSIZE=15 ; // 表中元素的最大个数
    typedef int ElemType; // 元素类型
    typedef struct list
    {
    ElemType elem[MAXSIZE]; // 静态分配
    int length; // 表的实际长度
    } SqList ; // 顺序表的类型名
  3. 建立顺序表时,利用随机函数自动产生数据

四、代码
(一)头文件

#pragma once
#include 
#include 
#include 
using namespace std;

const int MAXSIZE = 15;//最大元素个数定为15个
typedef int ElemType;//元素的类型
struct list
{
	ElemType elem[MAXSIZE];//存放元素的数组,静态分配
	int length;//实际长度
};//顺序表的类型
typedef struct list* SeqList;

SeqList SetList_Seq(int len)//建立顺序表
{
	SeqList list = (SeqList)malloc(sizeof(struct list) );
	list->length = len;
	srand((unsigned)time(NULL));//为rand函数提供种子seed,目的每次产生的随机数随着时间不同也产生不同的数据
	cout << "建立的顺序表为:";
	for (int i = 0; i < list->length; i++)
	{
		list->elem[i] = rand()%100;//随机函数除以100意思是说产生的数范围为0-100
		cout << list->elem[i] << "  ";
	}
	cout << "\n";
	return list;
}


int FindElem(SeqList list)//查找元素
{
	cout << "请您输入要查找的元素:";
	int a;
	cin >> a;
	int i;
	for (i = 0; i < list->length; i++)
	{
		if (list->elem[i] == a)
		{
			cout<<"查找成功!!!"<<endl;
			return 1;
		}
	}
	cout << "查找失败!!!"<<endl;
	return 0;
}


int JudgeSymmetry(SeqList list)//判断对称
{
	int i = 0;
	int j = list->length-1;
	for (; list->elem[i] == list->elem[j]; i++, j--)
	{
		if (j <= i)
		{
			cout << "对称!!!";
			return 1;
			break;
		}
	}
	cout << "不对称!!!"<<endl;
	return 0;
}


int OddEven(SeqList list)//奇数前偶数后
{
	ElemType* temp;
	int j = 0;
	temp = (ElemType*)malloc(sizeof(ElemType) * list->length);
	for (int i = 0; i < list->length; i++)
	{
		if (list->elem[i] % 2 == 1)//求模值为1位奇数
		{
			temp[j] = list->elem[i];
			j++;
		}
	}
	for (int i = 0; i < list->length; i++)
	{
		if (list->elem[i] % 2 == 0)//求模值为0位偶数
		{
			temp[j] = list->elem[i];
			j++;
		}
	}
	cout << "奇数在前偶数在后:";
	for (int i = 0; i < j; i++)
	{
		cout << temp[i] << "  ";
	}
	cout << "\n";
	return 0;
}

void CreadOrderList(SeqList list)//直接插入算法排序有序递增
{
	for (int i = 1 ; i < list->length; i++)
	{
		if (list->elem[i]<list->elem[i-1])
		{
			int temp;//临时变量
			temp = list->elem[i];
			list->elem[i] = list->elem[i-1];//把前者大的赋值给后者,后者小的给前者
			list->elem[i - 1] = temp;
			for (int j=i-2;list->elem[j+1]<list->elem[j];j--)//第二次循环,比较当前元素前面是否比现在元素大
			{			
				int temp;//临时变量
				temp = list->elem[j + 1];
				list->elem[j + 1] = list->elem[j];
				list->elem[j] = temp;
			}
		}
	}
	cout << "使用直接插入算法建立递增有序表:";
	for (int i = 0; i < list->length; i++)//输出元素
	{
		cout << list->elem[i] << "  ";
	}
	cout << "\n";
}

void Compound(SeqList list1,SeqList list2)//两个递增有序表list和list2合并一个递增有序表
{
	for (int i = 0; i < list2->length; i++)
	{
		list1->elem[list1->length] = list2->elem[i];//把第二个表元素接到第一个表上,实现合成
		(list1->length)++;
	}
	CreadOrderList(list1);//再把合成后的表进行直接插入算法建立递增有序表
}

(二)源文件

#include 
#include "顺序表应用.h"
using namespace std;

SeqList SetList_Seq(int);//1.输入一组整型元素序列(不少于 10 个),建立顺序表。
int FindElem(SeqList);//2.在该顺序表中进行顺序查找某一元素,查找成功返回 1,否则返回 0。
int JudgeSymmetry(SeqList);//3.判断该顺序表中元素是否对称,对称返回 1,否则返回 0。
int OddEven(SeqList);//4.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。
void CreadOrderList(SeqList list);//5.输入整型元素序列(不少于 10 个),利用有序表插入算法建立一个有序表。
void Compound(SeqList,SeqList);//6.利用算法 5 建立两个非递减有序表,并把它们合并成一个非递减有序表。

/*
设计菜单:
1.用户输入不少于10个元素建立顺序表
2.查找元素 成功1 失败0
3.判断元素是否对称 是返回1 不是0
4.实现奇数在偶数前
5.利用插入算法建立有序表
6.用算法5建立两个递增有序表,再把他们合成一个递增有序表
*/

int main()
{
	/*
		菜单的制作
	*/
	cout << "******************************************************************************************************************" << endl;
	cout << "******************************************************************************************************************" << endl;
	cout << "***********************" << "          ";
	cout << "您好!欢迎来到我的世界,这是我能为您提供的服务:" << "          " << "***********************" << endl;
	cout << "***********************" << "          ";
	cout << "1:建立顺序表" << "                                              " << "***********************" << endl;
	cout << "******************************************************************************************************************" << endl;
	cout << "请输入数字选择您要使用的算法:";
	int num;
	cin >> num;
	switch (num)//选择其中一个
	{
	case 1:
		cout << "您想建立的顺序表长度为:";
		int len;//len是实际长度
		cin >> len;
		SeqList list;
		list = SetList_Seq(len);//建立随机函数生成的元素
		cout << "\n";
		cout << "******************************************************************************************************************" << endl;
		cout << "***********************" << "          ";
		cout << "1:查找元素" << "                                                " << "***********************" << endl;
		cout << "***********************" << "          ";
		cout << "2:判断对称" << "                                                " << "***********************" << endl;
		cout << "***********************" << "          ";
		cout << "3:奇数前偶数后" << "                                            " << "***********************" << endl;
		cout << "***********************" << "          ";
		cout << "4:利用直接插入算法建立递增有序表" << "                          " << "***********************" << endl;
		cout << "***********************" << "          ";
		cout << "5:合成两个有序表" << "                                          " << "***********************" << endl;
		cout << "******************************************************************************************************************" << endl;
		cout << "请选择接下来您要进行的操作:";//用户选择操作算法
		int m;
		cin >> m;
		while (m!=0)
		{
			if (m == 1)	FindElem(list);		
			if (m == 2)	JudgeSymmetry(list);	
			if (m == 3)	OddEven(list);
			if (m == 4)	CreadOrderList(list);
			if (m == 5)
			{
				cout << "建立第一个递增有序表,输入长度:";
				int len1;
				cin >> len1;
				SeqList list1;
				list1 = SetList_Seq(len1);//建立第二个顺序表
				CreadOrderList(list1);//第二个递增有序表
				cout << "\n";

				cout << "建立第二个递增有序表,输入长度:";
				int len2;
				cin >> len2;
				SeqList list2;
				list2 = SetList_Seq(len2);//建立第二个顺序表
				CreadOrderList(list2);//第二个递增有序表
				cout << "是否合并这两个表y/n:";
				char m;
				cin >> m;
				if (m == 'y')Compound(list1, list2);
				else break;
			}
			cout << "\n";
			cout << "请选择你继续的操作:";
			cin >> m;
		}	break;
	}		
}

五、思考总结
1.代码质量还有待高,由于时间水平有限,菜单界面做得太粗糙了,下次一定升级菜单界面。
2.知识点方面:此实验出现了判断元素对称、用直接插入算法建立有序递增表和奇数在前偶数在后三个新思想,初次构想有些细节还没有考虑到。

谢谢您的浏览,由于水平有限,很多地方有待提高,若您有更好的建议欢迎留言!

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