已知顺序表中的元素依值递增有序排列,要求删除表中所有值相同的多余元素(使得操作后的顺序表中所有元素的值均不相同)
#include<stdio.h>
#include<stdlib.h>
#define INIT_LIST_SIZE 6//建立一个存储量为INIT_LIST_SIZE的表
#define INITINCREASE 3//表的扩展容量为INITCREASE
#define int ElemType//定义结构体中元素类型为int型
typedef//定义顺序表的结构体
{
ElemType *elem;//头结点的地址
int length;//现在表长
int listsize;//现在表的存储容量
}SqList;
void InitList(SqList &L);//表的初始化
void ListInsert(SqList &L,int i,ElemType e);//在L表的第i个元素之前插入e
void ListDelete(SqList &L,int i);//删除表L的第i个元素
void fun(SqList &L);//执行删除表重复元素的功能
void PrintList(SqList &L) ;//打印表L的元素
int main()
{
SqList La;
ElemType e;
int n,i=1;
InitList(La);
scanf("%d",&n);//输入插入元素个数
for(;i<=n;i++)
{
scanf("%d",&e);
ListInsert(La,,La.length+1,e);
}
fun(La);
PrintList(La);
free(L.elem);//释放结点空间
return 0;
}
void InitList(SqList &L)
{
L.elem=(ElemType *)malloc(INIT_LIST_SIZE*sizeof(ElemType));
if(!L.elem)
exit(-2);
L.length=0;
L.listsize=INIT_LIST_SIZE;
}
void ListInsert(SqList &L,int i,ElemType e)
{
ElemType *newbase,*p,*q;
if(i<1||i>L.length+1)//合法插入位置:i>=1&&i<=L.length+1如果插入位置不合法,强行终止程序
exit(-2);
if(L.length>=L.listsize)//如果表长达到最大存储容量,扩展
{
newbase=(ElemType*)realloc(L.elem,(INIT_LIST_SIZE +INITINCREASE)*sozeof(ElemType))
if(!newbase)
exit(-2);
L.elem=newbase;
L.listsize=INIT_LIST_SIZE +INITINCREASE;
}
//开始插入
q=L.elem[L.length-1];//q为最后一个元素的地址
p=L.elem[i-1];//p为第i个元素的地址
for(;q>=p;q--)//从第i个元素开始后移
*(q+1)=*(q);
*p=e;//将e赋值给第i个元素
L.length++;
}
void ListDelete(SqList &L,int i)
{
ElemType *p.*q;
if(i<1||i>L.length)//合法删除位置为i>=1||i<=L.length
exit(-2);
q=L.elem[L.length-2];
p=L.elem[i-1];
for(;p<=q;p++)
*(p)=*(p+1);
L.length--;
}
void fun(SqList &L)
{
int i;
for(i=1;i<=L.length;i++)//判断第i个元素要不要删除
{
if(L.elem[i]==L.elem[i-1])//单值递增,只要判断是否和前一个元素相同
{
ListDelete(L,i);
i--;//以防3个元素连续相同
}
}
}
void PrintList(SqList &L)
{
for(;L.elem<=L.elem+L.length-1;L.elem++)
printf("%d\n",*L.elem);
printf("\n");
}