假设顺序表L中的元素按从小到大的次序排列,编写算法删除顺序表中“多余”的数据元素,即操作之后的顺序表中所有元素的值都不相同

//假设顺序表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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值