本题要求实现一个函数,可删除顺序表中的偶数元素。
函数接口定义:
void Del_even(SqList *L);
其中 L
是待删除元素的顺序表,也是删除后返回的顺序表。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
typedef int DataType;
#define LISTSIZE 100
typedef struct
{
DataType items[LISTSIZE]; /* 存放顺序表元素的数组 */
int length; /* 表示线性表的当前表长 */
}SqList;
/* 【 本题要求函数-删除顺序表L中偶数元素 】*/
void Del_even(SqList *L);
int InitSqList(SqList *L)
{ /* L为指向顺序表的指针 */
L->length = 0;
return 1;
}
int SqListEmpty( SqList L )
{/* L为顺序表 */
if( L.length <= 0 )
return 1;
else
return 0;
}
int SqListInsert( SqList *L, int pos, DataType item )
{
int j;
if ( L->length == LISTSIZE ) // "溢出”处理
{
printf("overflow!\n");
return 0;
}
if ( (pos<=0) || (pos > L->length+1) ) // pos值"超出”处理
{
printf("position is error!/n");
return 0;
}
for (j = L->length -1; j >=pos-1; j--)
L-> items[j+1] = L-> items[j]; //后移一个位置
L-> items[pos-1] = item; //新的数据元素写入
L->length++; //线性表的长度增加1
return 1;
}
int SqListDelete ( SqList *L, int pos, DataType *item )
{/* L为指向顺序表的指针,pos为删除位置,用于item返回被删元素 */
int i;
if( SqListEmpty(*L) )
{
printf("顺序表为空表,无法进行删除操作!");
return 0;
}
if ( ( pos<1 ) || ( pos>L->length ) )
// 判断pos值是否超出所允许的范围
{
printf("删除位置不合法,其取值范围应该是[1,length]");
return 0;
}
*item = L->items[pos-1]; // 把第pos个元素赋给*item
for ( i=pos ; i<L->length ; i++ )
L->items[i-1]= L->items[i]; // 第i个元素后的所有元素依次前移
L->length--; // 顺序表长度减 1
return 1;
}
int TraverseSqList(SqList L)
{ /* L为顺序表 */
int i;
for (i=0;i<L.length;i++)
{
printf("%d ",L.items[i]);
}
printf("\n");
return 1;
}
int main()
{
SqList A;
DataType x;
char ch;
int pos = 1;
InitSqList(&A);
do
{
scanf("%d",&x); // 某些编译器要求此处改为scanf_s
SqListInsert( &A , pos++ , x );
}while ((ch=getchar())!='\n');
Del_even(&A);
TraverseSqList(A);
return 0;
}
/* 请在这里填写答案 */
输入样例
21 54 56 78 94 11 13 53 64 97 66 68 72 19
输出样例:
21 11 13 53 97 19
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解题代码:
void Del_even(SqList* L)
{
DataType item;
int i = 0;
for (i = 0; i < L->items[i]; i++)
{
if (L->items[i] % 2 == 0)
{
SqListDelete(L, i + 1, &item);
i--;
}
}
}