思路:设置两个指示器i和j,分别扫描顺序表中的元素,i和j分别从顺序表的左端和右端扫描。如果i遇到小于等于0的元素,略过不处理,继续向前扫描;若遇到大于0的元素暂停元素。同理j相反。
<span style="font-size:18px;"><span style="font-size:18px;">#include<stdio.h>
#include<stdlib.h>
#define ListSize 100
typedef int DataType;
typedef struct
{
DataType list[ListSize];
int length;
}SeqList;
void InitList(SeqList *L)
{
L->length=0;
}
int GetElem(SeqList L,int i,DataType *e)
{
if(i<1||i>L.length)
return -1;
*e=L.list[i-1];
return 1;
}
int InsertList(SeqList *L,int i,DataType e)
{
int j;
if(i<1||i>L->length+1)
{
printf("插入位置i不合法!\n");
return -1;
}
else if(L->length>=ListSize)
{
printf("顺序表已满,不能插入元素。\n");
return 0;
}
else
{
for(j=L->length;j>=i;j--)
L->list[j]=L->list[j-1];
L->list[i-1]=e;
L->length=L->length+1;
return 1;
}
}
void SplitSeqList(SeqList *L)
{
int i,j;
DataType e;
i=0,j=(*L).length-1;
while(i<j)
{
while(L->list[i]<=0)
i++;
while(L->list[j]>0)
j--;
if(i<j)
{
e=L->list[i];
L->list[i]=L->list[j];
L->list[j]=e;
}
}
}
void SplitSeqList(SeqList *L);
int main()
{
int i,flag,n;
DataType e;
SeqList L;
int a[]={-12,3,-6,-10,20,-7,9,-20};
InitList(&L);
n=sizeof(a)/sizeof(a[0]);
for(i=1;i<=n;i++)
{
if(InsertList(&L,i,a[i-1])==0)
{
printf("位置不合法");
return 0;
}
}
printf("顺序表中的元素:\n");
for(i=1;i<=L.length;i++)
{
flag=GetElem(L,i,&e);
if(flag==1)
printf("%4d",e);
}
printf("\n");
printf("顺序表L调整后:\n");
SplitSeqList(&L);
for(i=1;i<=L.length;i++)
{
flag=GetElem(L,i,&e);
if(flag==1)
printf("%4d",e);
}
printf("\n");
} </span></span>