从有序顺序表中删除所有其值重复的元素(用不同的负数代替),使所有元素的值均不同。

题目要求:从有序顺序表中删除所有其值重复的元素(用不同的负数代替),使所有元素的值均不同。
0:有序顺序表
1:删除所有其值重复的元素
2:用不同的负数代替
3:顺序表中所有元素的值均不同

#include <stdio.h>
#define maxSize 100//不能有分号
#include "stdlib.h"
#include "time.h"
typedef struct{
        int data[maxSize];
        int length;
}sqlist;
void init(sqlist *);//初始化一个有序顺序表
void showList(sqlist *);//输出顺序表
void deleteElement(sqlist *);//删除重复元素
//在代码头部声明使用(sqlist *list)作为参数的函数,一定写在结构体下方
int main(){
    sqlist mylist;
    init(&mylist);
    printf("初始化后的线性表如下(含大量重复元素):\n");
    showList(&mylist);
    deleteElement(&mylist);
    printf("删除重复元素后的线性表如下:\n");
    showList(&mylist);
}

//初始化一个有序顺序表
void init(sqlist *list){//此方法有大量重复元素
    list->data[0]=0;
    list->length=1;
    srand((int)time(0));
    for (int i = 1; i < maxSize; ++i) {
        list->data[i]=rand()%10000+1;
        if(list->data[i-1] < list->data[i]){//满足这个判断条件,要特别考虑顺序表的首未元素
            list->length++;
        } else{
            list->data[i] =list->data[i-1];//不能是i+1,数组会越界
            list->length++;
        }
    }

}

void showList(sqlist *list){
    for (int i = 0; i < list->length; ++i) {
        printf("%5d ",list->data[i]);
    }
}

void deleteElement(sqlist *list){
//    int *start=&list;
//    int *end=&list[maxSize-1];
        int num=0;
        for (int j = 0; j < maxSize-1; ++j) {
            if(list->data[j]==list->data[j+1]){
                list->data[j]=--num;
            }
        }
}

输出结果如下:

在这里插入图片描述

还有其他类似的题目:从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同,区别本题:(用不同的负数代替)
单纯删除重复元素(即:使元素个数减少);
用不同负数代替重复元素,达到“假删除效果”,(即:元素个数不变);本题采用的此法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值