/*
将顺序表非零元素依次移到表的前端
【问题描述】
将顺序表中所有非零元素依次移到表的前端。
【输入形式】
第一行输入整数N表示表长;
第二行输入N个整数,可包含零。
【输出形式】
输出将非零元素移到前端的表中元素,以空格作为分隔。
【样例输入】
6
2 0 -1 0 5 8
【样例输出】
2 -1 5 8 0 0
*/
#include <stdio.h>
#include <malloc.h>
#define INIT_SIZE 50
#define INCREM 10
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct SqList{
ElemType *slist;
int length;
int listsize;
}SqList;
int initList_sq(SqList *L){
L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));
if(!L->slist)return ERROR;
L->length=0;
L->listsize=INIT_SIZE;
return OK;
}
int insertList_sq(SqList *L,int i,ElemType e){
int k;
if(i<1||i>L->length+1)return ERROR;
if(L->length>=L->listsize)
L->slist=(ElemType*)realloc(L->slist,(INIT_SIZE+INCREM)*sizeof(ElemType));
if(!L->slist)return ERROR;
L->listsize=INIT_SIZE+INCREM;
for(k=L->length;k>i-1;k--){
L->slist[k]=L->slist[k-1];
}
L->slist[k]=e;
L->length++;
return OK;
}
int deleteList_sq(SqList *L,int i){
ElemType *q;
if(i<1||i>L->length)return ERROR;
q=L->slist+i;
for(;q<L->slist+L->length;q++)
*(q-1)=*q;
L->length--;
return ERROR;
}
int createList_sq(SqList *L,int n){
int i;
for(i=0;i<n;i++)
scanf("%d",&L->slist[i]);
L->length=n;
return OK;
}
void printList_sq(SqList *L){
int i;
for(i=0;i<L->length;i++)
printf("%d ",L->slist[i]);
}
/*
方法一:遍历顺序表,删除顺序表内零元素,再在顺序表末尾插入0。
*/
int listZeroBackward_sq(SqList *L){
int i;
for(i=0;i<L->length;i++){
if(L->slist[i]==0){
deleteList_sq(L,i+1);
insertList_sq(L,L->length+1,0);
}
}
}
/*
方法二:非零元素的前移,定义一个变量count用来记录遍历顺序表中非零元素的位置
*/
int listZeroBackward2_sq(SqList *L){
int i,count=0;
for(i=0;i<L->length;i++){
if(L->slist[i]!=0){
if(i!=count){
L->slist[count]=L->slist[i];
L->slist[i]=0;
}
count++;
}
}
}
int main(){
int n;
SqList l;
SqList *L=&l;
initList_sq(L);
scanf("%d",&n);
createList_sq(L,n);
// listZeroBackward_sq(L);
listZeroBackward2_sq(L);
printList_sq(L);
}