题目:
思路:
这个题目相对来说主要思路在于SLPop这个函数的设计上。
如果找到了等于m的数,那么需要分情况来讨论:
第一种情况就是普通情况,也就是在中间找到等于m的数,那么之需要把每个数依次向前挪动一个位置即可,并且这是的size要减少一个。
第二种情况就是在末尾的时候找到等于m的数,这时就不能够再去把后面的数移动在前面来,因为这样就会造成数组访问越界,只需要把size较少一个即可。
还需要注意的一个问题:
当每一次找到等于m的数时,我们都完成了后数的移动到前面的过程,那么这时我们需要用continue来跳过后面的i++这一步,因为还得继续判定后面移到这个位置上面来的数是否等于m,如果不等于那么直接i++即可。
代码:
#include<stdio.h>
#include<stdlib.h>
#define N 100
typedef struct SList
{
int data[N];
int size;
}SL;
void SLInit(SL* ps)
{
ps = (SL*)malloc(sizeof(SL));
ps->size = 0;
}
void SLCreate(SL* ps, int n)
{
int x = 0;
ps->size = n;
for (int i = 0; i < ps->size; i++)
{
scanf("%d", &x);
getchar();
ps->data[i] = x;
}
}
void SLPop(SL* ps, int m)
{
int i = 0;
while (i < ps->size)
{
if (ps->data[i] == m)
{
if (ps->size == i)
{
ps->size--;
}//这里主要是处理当最后一个数等于m时
else
{
int j = i;
while (j + 1 < ps->size)
{
ps->data[j] = ps->data[j + 1];
j++;
}
ps->size--;
}
continue;
//如果等于m时处理完过后,将后面的数依次向前移动一个位置
//跳出本次循环,主要是为了不让i完后移动
//因为不确定从后面移动过来的数是否等于m
}
i++;//i不断向后迭代
}
}
void SLPrint(SL* ps)
{
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->data[i]);
}
}
int main()
{
SL plist;
SLInit(&plist);
int n = 0;
scanf("%d", &n);
getchar();
SLCreate(&plist, n);
int m = 0;
scanf("%d", &m);
SLPop(&plist, m);
if (plist.size == 0)
{
printf("-1");
}
else
{
SLPrint(&plist);
}
return 0;
}