数据结构实验一:顺序表实验

#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);





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值