数据结构实验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 ; // 顺序表的类型名
  1. 建立顺序表时,利用随机函数自动产生数据。

源代码

1.head.h
#pragma once
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

2.List.h
//顺序表结构定义
#pragma once
#include "head.h"

const int MAXSIZE = 15; //表中元素的最大个数
typedef int ElemType;   //元素类型
typedef struct list
{
	ElemType elem[MAXSIZE]; //静态分配
	int length;             //表的实际长度
}List;
typedef List * SeqList;

SeqList InitSeqList()       //初始化顺序表
{
	SeqList slist = (SeqList)malloc(sizeof(MAXSIZE));
	memset(slist, 0, sizeof(MAXSIZE));
	memset(slist->elem, 0, sizeof(MAXSIZE));
	slist->length = 0;
	return slist;
}
int IsNullList_seq(SeqList slist)//判断顺序表是否为空
{
	return(slist->length == 0);
}

3.build_SqList.h
//随机函数生成顺序表
#pragma once
#include "head.h"
#include "List.h"
#include <time.h>

void build(SeqList slist, int m)
{
	if (m > MAXSIZE) {
		printf("overflow!");
		return;
	}
	srand(time(0));  //设置随机数种子
	for (int i = 0;i < m;i++)
	{
		slist->elem[i] = rand() % 50 + 1;
		slist->length++;
	}
	printf("成功生成顺序表:\n");
	for (int i = 0;i < slist->length;i++)
		printf("%d ", slist->elem[i]);
	printf("\n");
}

4.search_Seq.h
//查找元素
#pragma once
#include "List.h"

int search_Seq(SeqList slist, ElemType x)
{
	if (slist->length == 0) {
		printf("\n The list is NULL !\n");
		return 0;
	}
	int i;
	for (i = 0;i < slist->length;i++) {
		if (slist->elem[i] == x)
			return 1;
	}
	return 0;
}

5.Symmetry_Seq.h
//判断该顺序表中元素是否对称
#pragma once
#include "List.h"

int Symmetry_Seq(SeqList slist)
{
	int i = 0;
	int j = slist->length - 1;
	for (;slist->elem[i] == slist->elem[j];i++, j--)
		if (j <= i) {
			return 1;
			break;
		}
	return 0;
}

6.jiou_Seq.h
//实现把该表中所有奇数排在偶数之前
#pragma once
#include "List.h"

void jiou_Seq(SeqList slist)
{
	ElemType *temp;
	int j = 0;
	temp = (ElemType *)malloc(sizeof(ElemType)*slist->length);
	for (int i = 0;i < slist->length;i++)
		if (slist->elem[i] % 2 == 1) {
			temp[j] = slist->elem[i];
			j++;
		}
	for (int i = 0;i < slist->length;i++)
		if (slist->elem[i] % 2 == 0) {
			temp[j] = slist->elem[i];
			j++;
		}
	
	for (int i = 0;i < j;i++)
		printf("%d ", temp[i]);
	printf("\n");
}

7.Create_Seq.h
//利用有序表插入算法建立一个有序表
#pragma once
#include "List.h"

void Create_Seq(SeqList slist, int num)
{
	if (num > MAXSIZE) {
		printf("overflow!");
		return;
	}
	printf("请输入%d个非递减整数建立有序表:", num);
	for (int i = 0;i < num; i++) {
		scanf("%d", &slist->elem[i]);
		slist->length++;
	}
	printf("建表成功:");
	for (int i = 0;i < slist->length;i++)
		printf("%d ", slist->elem[i]);
	printf("\n");
}

8.Combine_Seq.h
//把两个非递减有序表合并为一个非递减有序表
#pragma once
#include "List.h"

void Combine_Seq(SeqList List1, SeqList List2, SeqList List3)
{
	int i = 0, j = 0, k = 0;int re = 0;
	while (i < List1->length&&j < List2->length) //循环 两两比较,小者存入List3
	{
		if (List1->elem[i] < List2->elem[j])
			List3->elem[k++] = List1->elem[i++];
		else if (List1->elem[i] == List2->elem[j])
		{
			List1->elem[i] = List2->elem[j++];
			re++;  //记录重复元素的次数
		}
		else
			List3->elem[k++] = List2->elem[j++];
	}
	while (i < List1->length) //List1中还剩没有比较完的元素
		List3->elem[k++] = List1->elem[i++];
	while (j < List2->length) //List2中还剩没有比较完的元素
		List3->elem[k++] = List2->elem[j++];
	List3->length = List1->length + List2->length - re;
	printf("合并成功:\n");
	for (int i = 0;i < List3->length;i++)
		printf("%d ", List3->elem[i]);
	printf("\n");
}

cpp文件
#include "stdafx.h"
#include "List.h"
#include "build_SqList.h"
#include "search_Seq.h"
#include "Symmetry_Seq.h"
#include "jiou_Seq.h"
#include "Create_Seq.h"
#include "Combine_Seq.h"

int main()
{
	int index = 0;
	SeqList slist = InitSeqList();
	printf("					顺序表\n");
	printf("	****************************************************************************\n");
	printf("		1.输入一组整型元素序列(不少于 10 个),建立顺序表。\n");
	printf("		2.在该顺序表中进行顺序查找某一元素,查找成功返回 1,否则返回 0。\n");
	printf("		3.判断该顺序表中元素是否对称,对称返回 1,否则返回 0。\n");
	printf("		4.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。\n");
	printf("		5.输入整型元素序列(不少于 10 个),利用有序表插入算法建立一个有序表。\n");
	printf("		6.利用算法 5 建立两个非递减有序表,并把它们合并成一个非递减有序表。\n");
	printf("		0.退出。\n");
	printf("	****************************************************************************\n");
	while (1)
	{
		printf("\n请输入一个序号:");
		scanf("%d", &index);
		switch (index)
		{
		case 0: return 0;
		case 1:
		{
			int m;
			printf("请输入顺序表的长度:");
			scanf("%d", &m);
			build(slist, m);
		}break;
		case 2:
		{
			if(IsNullList_seq(slist))
				printf("The list is NULL !\n");
			else{
				int x;
				printf("请输入要查找的数:");
				scanf("%d", &x);
				if (search_Seq(slist, x))
					printf("顺序表中存在此元素\n");
				else printf("该顺序表中无此元素!\n");
			}
		}break;
		case 3:
		{
			if (IsNullList_seq(slist))
				printf("The list is NULL !\n");
			else {
				if (Symmetry_Seq(slist))
					printf("顺序表对称!\n");
				else printf("顺序表不对称!\n");
			}
		}break;
		case 4:
		{
			if (IsNullList_seq(slist))
				printf("The list is NULL !\n");
			else {
				printf("将所有奇数排在偶数之前:\n");
				jiou_Seq(slist);
			}
		}break;
		case 5:
		{
			int num;
			SeqList List = InitSeqList();
			printf("请输入List的长度:");
			scanf("%d", &num);
			Create_Seq(List, num);
		}break;
		case 6:
		{
			int num1, num2;
			SeqList List1 = InitSeqList();
			SeqList List2 = InitSeqList();
			SeqList List3 = (SeqList)malloc(sizeof(2 * MAXSIZE));
			List3->length = 0;
			printf("请输入List1的长度:");
			scanf("%d", &num1);
			Create_Seq(List1, num1);
			printf("请输入List2的长度:");
			scanf("%d", &num2);
			Create_Seq(List2, num2);
			
			Combine_Seq(List1, List2, List3);
		}break;
		default:printf("输入有误,请输入数组0-6!");
		}
	}
	system("pause");
	return 0;
}

运行截图

  • 4
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值