/*创建一个顺序表,表中元素无序,删除顺序表中值相同的元素,并输出顺序表删除前后的所有元素。*/
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100 //线性表初始空间的分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef int ElemType; //线性表数据类型
typedef struct
{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize;//当前分配的存储容量
}SqList;
int initList_Sq(SqList *L); //初始化
int Print_Sq(SqList *L); //打印
int ListInsert_Sq(SqList *L, int i, ElemType e);//插入
int Find_Del_Sq(SqList *L);//查找和删除
int initList_Sq(SqList *L)
{
L->elem = (ElemType *)malloc(sizeof(ElemType) * LIST_INIT_SIZE);
if(!L->elem)
exit(-1);
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return 0;
}
int ListInsert_Sq(SqList *L, int i, ElemType e) //在顺序表L中第i个位置之前插入新的元素e
{
ElemType * newbase;//重新分配的空间地址
ElemType *p, *q;//用于移动顺序表元素的指针
if( i < 0 || i > L->length )
return -1;
//空间够大,增加空间
if( L->length >= L->listsize)
{
newbase = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType));
if(!newbase)
exit(-1);
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
//开始移动元素
q = &(L->elem[i]);
for(p=&(L->elem[L->length-1]); p >= q; --p)
*(p+1) = *(p);
*q = e;
++L->length;//表长加1
return 0;
}
int Find_Del_Sq(SqList *L)
{
ElemType *p;
int len;
int i,j,m;
if(!L)
{
printf("顺序表为空!\n");
return 0;
}
len = L->length ;
p = &(L->elem[0]);//顺序表第一个元素的地址
for(i=0;i<len;i++)
{
for(j=i+1;j<L->length+1;j++)
{
if(*(p+i)==*(p+j))
{
for(m=j;m<L->length+1;m++)
*(p+m)=*(p+m+1);
(L->length)--;
j--; //这里很重要,因为每一次删除一个后往前移动了一个,所以这里要从前一个位置从新比较.....
}
}
}
return 0;
}
int Print_Sq(SqList *L)
{
ElemType *p;
int len;
len = L->length ;
p = &(L->elem[0]);//顺序表第一个元素的地址
if(!p)
{
printf("the SqList can't be empty!\n");
exit(1);
}
else
{
printf("the SqList is: \n");
while(len--)
{
printf("%d->", *p++);
}
printf("\n");
}
return 0;
}
int main(void)
{
SqList L;
int size;
int i=0;
ElemType e;
if(!initList_Sq(&L))
printf("init a sqlist ok\n");
else
printf("init a sqlist failed!\n");
printf("输入顺序表的大小:");
scanf("%d", &size);
while(size --)
{
printf("输入第%d数据用来插入:\n",i+1);
scanf("%d", &e);
ListInsert_Sq(&L, i++, e);
}
printf("数据插入 OK!\n");
printf("删除前:\n");
Print_Sq(&L);
Find_Del_Sq(&L);
printf("删除后顺序表:\n");
Print_Sq(&L);
return 0;
}