#include <iostream>
#include "seqlist.h"
using namespace std;
void test01();
void test02();
void test03();
void test04();
void test05();
void test06();
int main()
{
int i; //选择序号i
cout << "*********************************************************************************" << endl;
cout << "* 欢迎您来到测试页面,现在开始您的测试 *" << endl;
cout << "*----------------------------- 功能页面 ---------------------------------------*" << endl;
cout << "* 1.在第i个结点位置插入值为x的结点 *" << endl;
cout << "* 2.删除顺序表中第i个元素结点 *" << endl;
cout << "* 3.在递增序列中插入x元素,并保持递增性 *" << endl;
cout << "* 4.顺序表中奇数项和偶数项分开 *" << endl;
cout << "* 5.求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中 *" << endl;
cout << "* 6.删除递增有序顺序表中的重复元素,并统计移动元素次数 *" << endl;
cout << "* 7.退出功能页面 *" << endl;
cout << "*********************************************************************************" << endl;
cout << "输入你要选择的功能序号:";
cin >> i;
switch (i)
{
case 1:
test01();
break;
case 2:
test02();
break;
case 3:
test03();
break;
case 4:
test04();
break;
case 5:
test05();
break;
case 6:
test06();
break;
case 7:
return 0;
}
system("pause");
system("cls");
}
void test01()
{
seqList L1;
seqList* L;
L = &L1;
int x; //插入的值
//int j; //插入的次数
int i; //插入的位置序号
initialList(L);
listCreate(L);
cout << "输入要插入的值:";
cin >> x;
cout << "输入要插入的位置:";
cin >> i;
listInsert(L, x, i);
cout << "插入后的顺序表为:";
listOutput(L);
}
void test02()
{
seqList L1;
seqList* L;
L = &L1;
int i; //删除位置序号
//int j; //删除的次数
initialList(L);
if (!listCreate(L))
{
cout << "空表,无法进行删除操作";
}
else
{
cout << "输入要删除的位置:";
cin >> i;
//cout << "输入要删除的次数:";
//cin >> j;
listDelete(L, i);
cout << "删除后的顺序表为:";
listOutput(L);
cout << endl;
}
}
void test03()
{
seqList L1;
seqList* L;
L = &L1;
int x;
initialList(L);
if (!listCreate(L))
{
cout << "空表,错误!";
}
else
{
cout << "输入要插入的数据:";
cin >> x;
listInsert2(L, x);
cout << "删除后的顺序表为:";
listOutput(L);
cout << endl;
}
}
void test04()
{
seqList L3;
seqList* L;
seqList L1;
seqList L2;
L = &L3;
initialList(L);
listCreate(L);
cout << "原顺序表为:";
listOutput(L);
listSeperate(L, &L1, &L2);
cout << endl;
cout << "偶数顺序表为:";
listOutput(&L1);
cout << endl;
cout << "奇数顺序表为:";
listOutput(&L2);
}
void test05()
{
seqList L4;
seqList* L;
seqList L1;
seqList L2;
seqList L3;
L = &L4;
/*/L1 = &L4;
L2 = &L4;
L3 = &L4;*/
initialList(&L1);
listCreate(&L1);
cout << "顺序表L1为:";
listOutput(&L1);
cout << endl;
initialList(&L2);
listCreate(&L2);
cout << "顺序表L2为:";
listOutput(&L2);
listBoth(L1, L2, &L3);
cout << endl;
cout << "含L1和L2中公共元素的新表L3为:";
listOutput(&L3);
}
void test06()
{
seqList L1;
seqList* L;
L = &L1;
initialList(L);
listCreate(L);
listCancle(L);
}
seqlist.cpp
#include "seqlist.h"
#include "iostream"
#define Maxlen 100
using namespace std;
//初始化顺序表
void initialList(seqList* L)
{
L->listLen = 0;
}
//顺序表数据初始化
int listCreate(seqList* L)
{
int j, len;
cout << "请输入顺序表长度:";
cin >> len;
if (len == 0)
{
cout << "空表" << endl;
return 0;
}
else if (len > Maxlen) {
cout << "overflow" << endl;
return 1;
}
else
{
cout << "请输入顺序表的数据:";
for (j = 0; j < len; j++)
{
cin >> L->data[j];
L->listLen++;
}
return 2;
}
}
//将顺序表中的元素输出
void listOutput(seqList* L)
{
for (int i = 1; i <= L->listLen; i++)
{
cout << L->data[i - 1] << ' '; //组序比位序少一
}
}
//插入算法:在第i个结点位置插入值为x的结点
void listInsert(seqList* L, int x, int i)
{
int j;
if (L->listLen == Maxlen)
{
cout << "overflow" << endl; //表满,不能插入
}
else if (i<1 || i>L->listLen + 1)
{
cout << "position error" << endl;
}
else if(i>=1 && i<= L->listLen+1)
{
for (j = L->listLen - 1; j >= i - 1; j--)
{
L->data[j + 1] = L->data[j];
}
L->data[i - 1] = x;
L->listLen++;
}
}
//删除算法:删除顺序表中第i个元素结点
void listDelete(seqList* L, int i)
{
int j;
if (L->listLen <= 0)
cout << "下溢出错" << endl; //空表不能删除元素
if (i<1 || i>L->listLen)
cout << "删除位置错误" << endl; //序号错误,删除元素不存在
else
{
for (j = i; j <= L->listLen - 1; j++) //向前批量移动元素
{
L->data[j - 1] = L->data[j];
}
L->listLen--; //表长度减1
}
}
//在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性
void listInsert2(seqList* L, int x)
{
L->data[L->listLen - 1] = x; //把插入的数放在顺序表的末尾
for (int i = L->listLen-1; i > 0; i--)
{
if (L->data[i] >= L->data[i - 1]) //如果插入的数比之前的都大,则满足递增要求退出
{
break;
}
else //插入的数比相邻之前的数小,则互换位置
{
int temp;
temp = L->data[i];
L->data[i] = L->data[i - 1];
L->data[i - 1] = temp;
}
}
}
//顺序表中奇数项和偶数项分开
void listSeperate(seqList* L,seqList* L1, seqList* L2)
{
int a=0; //记录L1表的长度
int b=0; //记录L2表的长度
for (int i = 0; i < L->listLen; i++)
{
if (L->data[i] % 2 == 0)//L1为偶数表
{
L1->data[a] = L->data[i];
a++;
//listInsert(L1, L->data[i], i + 1);
}
else if(L->data[i] % 2 != 0) //L2为奇数表
{
L2->data[b] = L->data[i];
b++;
//listInsert(L2, L->data[i], i + 1);
}
}
L1->listLen = a;
L2->listLen = b;
}
//求两个递增有序顺序表L1和L2中的公共元素
void listBoth(seqList L1,seqList L2, seqList* L3)
{
int i = 0, j = 0, k = 0;
while (i < L1.listLen && j < L2.listLen) //减少遍历次数,只要有一个表遍历结束则结束
{
if (L1.data[i] == L2.data[j])
{
L3->data[k] = L1.data[i];
i++;
j++;
k++;
}
else if (L1.data[i] > L2.data[j])
{
j++;
}
else if (L1.data[i] < L2.data[j])
{
i++;
}
}
L3->listLen = k;
}
//删除递增有序顺序表中的重复元素,并统计移动元素次数
void listCancle(seqList* L)
{
int count=0; //统计移动元素次数
int p = L->listLen-1;
int q = L->listLen; //由于删除过程中L->listLen的值会发生改变,所以先把顺序表的初始长度记录下来
for (int i = 1; i < q; i++)
{
if (L->data[p] == L->data[p - 1])
{
listDelete(L, p + 1);
count += L->listLen - p;
}
p--; //跳到前一个元素
}
cout << "删除重复元素以后的新表为:";
listOutput(L);
cout << endl;
cout << "移动元素的次数为:" << count;
}
seqlist.h
#pragma once
#define Maxlen 100
typedef struct seqList
{
int data[Maxlen]; //定义存储表中元素的数组
int listLen; //定义表长度分量
}seqList;
//函数声明
void initialList(seqList* L);
int listCreate(seqList* L);
void listOutput(seqList* L);
void listInsert(seqList* L, int x, int i);
void listDelete(seqList* L, int i);
void listInsert2(seqList* L, int x);
void listSeperate(seqList* L, seqList* L1, seqList* L2);
void listBoth(seqList L1, seqList L2, seqList* L3);
void listCancle(seqList* L);