题目要求:从有序顺序表中删除所有其值重复的元素(用不同的负数代替),使所有元素的值均不同。
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;
}
}
}
输出结果如下:
还有其他类似的题目:从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同,区别本题:(用不同的负数代替);
单纯删除重复元素(即:使元素个数减少);
用不同负数代替重复元素,达到“假删除效果”,(即:元素个数不变);本题采用的此法;