//假设顺序表L中的元素按从小到大的次序排列,编写算法删除顺序表中“多余”的数据元素,即操作之后的顺序表中所有元素的值都不相同,
// 要求时间尽可能的少;
//并对顺序表A(1,1,2,2,2,3,4,5,5,5,6,6,7,7,8,8,8,9)模拟执行本算法,并统计移动元素的次数。
代码带有注释详解
#include <stdio.h>
#define NUM 50
typedef int DT;
typedef struct{//线性表结构体
DT data[NUM];
int length;
}SeqList;
void InitList(SeqList &L) {//初始化函数
L.length = 0;
}
void Input(SeqList& L, DT number) {//输入数据函数
if(L.length == NUM)//判断合法性
{
printf("输入数据个数超过最大长度%d!\n", NUM);
return;
}
L.data[L.length++] = number;//输入数据 并让length自增
}
bool DelRe(SeqList& L, int& DelNum, int& MoveNum) {//删除多余数据元素函数 返回删除元素的个数 和 移动元素的次数
if (L.length==0)
{
printf("参数顺序表的长度为0!\n");
return false;
}
DT CommonNum=L.data[0];
int i,j;
for (i = 1; i < L.length; i++)
{
if (L.data[i] == CommonNum) {
if (i == L.length - 1) {//若最后一个元素也是多余元素则不需要移动 只需要减掉即可
L.length--;
DelNum++;//删除个数加一
}
else {
for (j = i; j < L.length - 1; j++) {
L.data[j] = L.data[j + 1];
MoveNum++;//移动次数加一
}
L.length--;
DelNum++;//删除个数加一
}
i--;//现在下标为i的元素实际上原本是被删除的下标为i的元素的后一位元素 所以删除仍然需要比较是否多余
}
else CommonNum = L.data[i];//不多余则把该元素赋值给比较参数用于和后面元素比较
}
}
int main() {
SeqList L;
InitList(L);
int num,member,i;
printf("请输入您要插入顺序表的数的个数(不要超过%d个)\n",NUM);
scanf_s("%d", &num);
printf("请输入您要插入顺序表的%d个数\n", num);
for (i = 0; i < num; i++) {
scanf_s("%d,",&member);
Input(L, member);
}
int DelNum=0, MoveNum=0; //删除元素的个数 和 移动元素的次数
if (DelRe(L, DelNum, MoveNum)) {
printf("共删除了%d个元素\n共移动了%d次\n去除多余元素之后线性表存储结果如下", DelNum, MoveNum);
for (i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
}
else printf("操作失败!\n");
return 0;
}
#include <stdio.h>
#define NUM 50
typedef int DT;
typedef struct{//线性表结构体
DT data[NUM];
int length;
}SeqList;
void InitList(SeqList &L) {//初始化函数
L.length = 0;
}
void Input(SeqList& L, DT number) {//输入数据函数
if(L.length == NUM)//判断合法性
{
printf("输入数据个数超过最大长度%d!\n", NUM);
return;
}
L.data[L.length++] = number;//输入数据 并让length自增
}
bool DelRe(SeqList& L, int& DelNum, int& MoveNum) {//删除多余数据元素函数 返回删除元素的个数 和 移动元素的次数
if (L.length==0)
{
printf("参数顺序表的长度为0!\n");
return false;
}
DT CommonNum=L.data[0];
int i,j;
for (i = 1; i < L.length; i++)
{
if (L.data[i] == CommonNum) {
if (i == L.length - 1) {//若最后一个元素也是多余元素则不需要移动 只需要减掉即可
L.length--;
DelNum++;//删除个数加一
}
else {
for (j = i; j < L.length - 1; j++) {
L.data[j] = L.data[j + 1];
MoveNum++;//移动次数加一
}
L.length--;
DelNum++;//删除个数加一
}
i--;//现在下标为i的元素实际上原本是被删除的下标为i的元素的后一位元素 所以删除仍然需要比较是否多余
}
else CommonNum = L.data[i];//不多余则把该元素赋值给比较参数用于和后面元素比较
}
}
int main() {
SeqList L;
InitList(L);
int num,member,i;
printf("请输入您要插入顺序表的数的个数(不要超过%d个)\n",NUM);
scanf_s("%d", &num);
printf("请输入您要插入顺序表的%d个数\n", num);
for (i = 0; i < num; i++) {
scanf_s("%d,",&member);
Input(L, member);
}
int DelNum=0, MoveNum=0; //删除元素的个数 和 移动元素的次数
if (DelRe(L, DelNum, MoveNum)) {
printf("共删除了%d个元素\n共移动了%d次\n去除多余元素之后线性表存储结果如下", DelNum, MoveNum);
for (i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
}
else printf("操作失败!\n");
return 0;
}