顺序表-非零元素前移

/*
将顺序表非零元素依次移到表的前端
【问题描述】

将顺序表中所有非零元素依次移到表的前端。

【输入形式】

第一行输入整数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);

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值