2.1 实验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. 建立顺序表时,利用随机函数自动产生数据。

DS.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
#pragma once

SqList.h

#include "DS.h"
typedef int ElemType;
const  int  MAXSIZE = 15;   // 表中元素的最大个数 
typedef struct
{
	ElemType  elem[MAXSIZE];  // 静态分配 
	int length;
}SqList;
void menu();
Status CreateList_Sq(SqList& L);/*建立顺序表*/
void PrintList_Sq(SqList L);/*输出顺序表*/
Status issymmetry_Sq(SqList L);/*判断线性表是否对称*/
Status Seek_Sq(SqList* L, int x);/*查找元素x*/
Status AdjustList_Sq(SqList& L);/*奇数排在偶数之前*/
Status  OrderList_sq(SqList& L, int n);/*插入法生成递增有序表*/
void Merge(SqList* La, SqList* Lb, SqList* Lc);/*两个非递减有序表A和B,并把它们合并成一个非递减有序表C*/
#pragma once

SqList.cpp

#include "SqList.h"
#include<ctime>
void menu()
{
	printf("顺序表基本操作\n\n");
	printf("1.建立顺序表\n");
	printf("2.查找元素x\n");
	printf("3.判断是否对称\n");
	printf("4.奇数排在偶数之前\n");
	printf("5.插入法生成递增有序表\n");
	printf("6.两个非递减有序表La和Lb合并成非递减有序表Lc\n");
	printf("0.退出\n\n");
}



/*建立顺序表*/
Status CreateList_Sq(SqList& L)
{
	int n, i;
	printf("请输入顺序表长度:");
	scanf_s("%d", &n);
//printf("请输入%d个元素:", n);
		//for (i = 0; i < n; i++)
		//{

		//	scanf_s("%d", &L.elem[i]);

		//}//输入n个数
		srand((unsigned int)time(0));
		for (i = 0; i < n; i++) {
			L.elem[i] = int(double(rand()) / RAND_MAX * (50 - 20) + 20);//随机生成[20,50]区间数
		}
		L.length = n;
		return OK;
	}
	


/*输出顺序表*/
void PrintList_Sq(SqList L)
{
	int i;
	printf("顺序表中元素为:\n");
	for (i = 0; i < L.length; i++)
	{
		printf("%d ", L.elem[i]);
	}
	printf("\n");
}
/*判断线性表是否对称*/
Status issymmetry_Sq(SqList L)
{
	int i = 0;
	int j = (L.length) - 1;
	for (i, j; i <= j; i++, j--)
	{
		if (L.elem[i] == L.elem[j]) return true;
		else 
			return false;
	}
}
/*查找元素x*/
Status Seek_Sq(SqList* L, int x)
{
	int i = 0;
	for (; i < L->length; i++)
	{
		if (L->elem[i] == x)
			return 1;
	}
	return 0;
}


/*奇数排在偶数之前*/
Status AdjustList_Sq(SqList& L)
{

	ElemType* p, * q;
	int t = 0;
	int len = L.length;
	p = L.elem;
	q = L.elem + L.length - 1;
	while (p < q) {
		if (!(*p & 1)) {//从头开始遇到偶数为真
		if ((*q & 1)) {//从尾开始遇到奇数为真
				t = *p;
				*p = *q;
				*q = t;
			}
			else {
				q--;
			}
		}
		else {
			p++;
		}
	}
	return OK;
}
/*插入法生成递增有序表*/
Status  OrderList_sq(SqList& L, int n)
{
	int i, j, k, x;
	printf("请输入%d个数:", n);
	for (  i = 0; i < n; i++) {
		scanf_s("%d", &x);
		ElemType* p, len = L.length;
		p = L.elem;
		for (j = 0; j < len; j++) {
			if (x > p[j]) continue;
			for (k = len; k > j; k--) {
				p[k] = p[k - 1];
			}
			p[j] = x;
			break;
		}
		if (j >= len) {
			p[len] = x;
		}
		L.length++;
	}return OK;
}

/*两个非递减有序表A和B,并把它们合并成一个非递减有序表C*/
void Merge(SqList *La, SqList *Lb, SqList *Lc) {
	int i = 0; int j = 0; int k = 0;
	while (i < La->length && j < Lb->length)
	{
		if (La->elem[i] <= Lb->elem[j]) { Lc->elem[k] = La->elem[i]; k++; i++; }
		else { Lc->elem[k] = Lb->elem[j]; k++; j++; }		
	}

	while (i < La->length) { Lc->elem[k] = La->elem[i]; k++; i++; }
	while (j <Lb->length) { Lc->elem[k] = Lb->elem[j]; k++; j++; }
	Lc->length = La->length + Lb->length;
	}

main.cpp

#include "SqList.h"
int main()
{
	int choice, n, i, x;
	SqList *L, *La, *Lb, *Lc;
	L = (SqList*)malloc(sizeof(SqList));
	La = (SqList*)malloc(sizeof(SqList));
	Lb = (SqList*)malloc(sizeof(SqList));
	Lc = (SqList*)malloc(2*sizeof(SqList));
	L->length = 0;
	La->length = 0;
	Lb->length = 0;
	Lc->length = 0;
	while (1)
	{
		menu();
		printf("选择你的操作:");
		scanf_s("%d", &choice);
		switch (choice)
		{
		case 1:
			if (CreateList_Sq(*L))//形参为引用型参数,实参只需要传送变量名即可,以下函数调用均是如此
			{
				printf("顺序表创建成功\n");
				PrintList_Sq(*L);
			}
			else
				printf("顺序表创建失败\n");
			break;
		case 2:
			printf("请输入查找元素x:");
			scanf_s("%d", &x);
			if (Seek_Sq(L, x)) printf("查找成功\n");
			else printf("查找失败\n");
			break;
		case 3:
			
				if (issymmetry_Sq(*L) == true)
					printf("该线性表是对称的\n");
				else
					printf("该线性表不是对称的\n");
			
			break;
		case 4:
			AdjustList_Sq(*L);
			printf("新链表为:\n");
			PrintList_Sq(*L);
			break;
		case 5:
			printf("请输入顺序表长度:");
			scanf_s("%d", &n);
			if (OrderList_sq(*L, n))

			{

				printf("值有序顺序表为:\n");

				PrintList_Sq(*L);

			}

			else

				printf("顺序表创建失败\n");

			break;
			
		case 6:
			printf("请输入顺序表La的长度:");
			scanf_s("%d", &n);
			OrderList_sq(*La, n);
			printf("请输入顺序表Lb的长度:");
			scanf_s("%d", &n);
			OrderList_sq(*Lb, n);		
			Merge(La,Lb,Lc);
			printf("合并后的顺序表为:\n");
			PrintList_Sq(*Lc);
			break;
		case 0:
			return 0;
		default:
			printf("输入错误,请重新输入\n");
		}
	}
}

vs2019运行成功
运行截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值