数据结构
题目描述
在长度为n(n<1000)的顺序表中可能存在着一些值相同的“多余”数据元素(类型为整型),编写一个程序将“多余”的数据元素从顺序表中删除,使该表由一个“非纯表”(值相同的元素在表中可能有多个)变成一个“纯表”(值相同的元素在表中只能有一个)。
示例输入
第一行输入表的长度n;第二行依次输入顺序表初始存放的n个元素值。
输出
第一行输出完成多余元素删除以后顺序表的元素个数;第二行依次输出完成删除后的顺序表元素。
示例输入
12
5 2 5 3 3 4 2 5 7 5 4 3
示例输出
5
5 2 3 4 7
//线性顺序表
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1000 //线性表存储空间的初始分配量
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int elemType;//元素类型
typedef struct
{
elemType *elem;//线性表首地址
int length;//当前的长度
} SqList;
//初始化一个空的线性表
int InitList_Sq(SqList *L)
{
L->elem=new elemType[MAXSIZE];
if(!L->elem)exit(OVERFLOW);//overflow
L->length=0;//初始表为空表
return OK;
}
//遍历顺序表
void TraverseList(SqList *L)
{
int i;
for(i=0; i<L->length; i++)
{
printf("%d ",L->elem[i]);
}
printf("\n");
return;
}
//向表尾插入元素
void InsertLast(SqList *L,elemType e)
{
if(L->length >= MAXSIZE)
return ;
L->elem[L->length]=e;
L->length++;
return;
}
void ListDelete(SqList *L,elemType i)//删除指定位置的线性表
{
// if((i<1)||(i>L->length)) return;
for(int j = i; j <= L->length-1; j++)
L->elem[j] = L->elem[j+1];
--(L->length);
}
//删除重复值
void DeleteElem(SqList *L)
{
for(int i = 0 ;i < L->length ;i++)
{
for(int j = i+1 ;j <= L->length-1 ;j++)
{
if(L->elem[i] == L->elem[j])
{
ListDelete(L,j);
j--;
}
}
}
}
int main()
{
SqList list1;
InitList_Sq(&list1);
int n;
scanf("%d",&n);
int i;
elemType temp;
for(i=0; i<n; i++)
{
scanf("%d",&temp);
InsertLast(&list1,temp);
}
DeleteElem(&list1) ;
printf("%d\n",list1.length);
TraverseList(&list1);
return 0;
}
//线性顺序表
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1000 //线性表存储空间的初始分配量
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int elemType;//元素类型
typedef struct
{
elemType *elem;//线性表首地址
int length;//当前的长度
} SqList;
//初始化一个空的线性表
int InitList_Sq(SqList *L)
{
L->elem=new elemType[MAXSIZE];
if(!L->elem)exit(OVERFLOW);//overflow
L->length=0;//初始表为空表
return OK;
}
//遍历顺序表
void TraverseList(SqList *L)
{
int i;
for(i=0; i<L->length; i++)
{
printf("%d ",L->elem[i]);
}
printf("\n");
return;
}
//向表尾插入元素
void InsertLast(SqList *L,elemType e)
{
if(L->length >= MAXSIZE)
return ;
L->elem[L->length]=e;
L->length++;
return;
}
void ListDelete(SqList *L,elemType i)//删除指定位置的线性表
{
// if((i<1)||(i>L->length)) return;
for(int j = i; j <= L->length-1; j++)
L->elem[j] = L->elem[j+1];
--(L->length);
}
//删除重复值
void DeleteElem(SqList *L)
{
for(int i = 0 ;i < L->length ;i++)
{
for(int j = i+1 ;j <= L->length-1 ;j++)
{
if(L->elem[i] == L->elem[j])
{
ListDelete(L,j);
j--;
}
}
}
}
int main()
{
SqList list1;
InitList_Sq(&list1);
int n;
scanf("%d",&n);
int i;
elemType temp;
for(i=0; i<n; i++)
{
scanf("%d",&temp);
InsertLast(&list1,temp);
}
DeleteElem(&list1) ;
printf("%d\n",list1.length);
TraverseList(&list1);
return 0;
}