题目描述
输入
第二行依次输入顺序表初始存放的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>
#include<malloc.h>
#define LISTINCREASMENT 100
#define LISTSIZE 10
#define OVERFLOW -1
#define OK 1
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}Sqlist;
int SqInitialList(Sqlist &L)//顺序表的初始化;
{
L.elem=(ElemType *)malloc(LISTSIZE*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);
L.length=0;
L.listsize=LISTSIZE;
return OK;
}
int ListInsert(Sqlist &L,int i,ElemType e)//顺序表元素的添加;
{
if(i<1||i>L.length+1)printf("ERROR!");
if(L.length>=L.listsize)
{
ElemType*newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREASMENT)*sizeof(ElemType));//动态变量的空间扩充;
if(!newbase) return OVERFLOW; //判断是否空间开辟成功;
L.elem=newbase;
L.listsize+=LISTINCREASMENT;
}
ElemType*q=&(L.elem[i-1]);
ElemType*p;
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}
void purge(Sqlist &L)//顺序表相同元素的删除,位移算法;
{
int i,b,j,k;
for(i=0;i<L.length-1;i++)
{
j=i+1;
while(j<L.length)
if(L.elem[j]!=L.elem[i]) ++j;
else
{
for(k=j+1;k<L.length;++k)
L.elem[k-1]=L.elem[k];
--L.length;
}
}
}
int main()
{
Sqlist L;//顺序表的定义;
int t=1,d,n;
scanf("%d",&n);
SqInitialList(L);//顺序表的初始化;
for(t=1;t<=n;t++)
{
scanf("%d",&d);
ListInsert(L,t,d);//顺序表元素的添加;
}
purge(L);//顺序表相同元素删除后的顺序表;
printf("%d\n",L.length);//此顺序表的长度;
for(t=1;t<=L.length;t++)//顺序表的所有元素输出;
if(t!=L.length)
printf("%d ",L.elem[t-1]);
else
printf("%d\n",L.elem[t-1]);
return 0;
}