目的要求
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运行成功
运行截图: