前面我们学会了,顺序表的移动问题。
删除无非就是找到这个元素把他后面的移动到前面来,然后再个数减一就完成了。
所以呢,分三步.
1:找到元素
架设一个循环跑呗.设要删除的元素为key,顺序表长度为n。
for(i=0;i<n&&a[i]-key;i++);
出了这个空循环,就有两种可能,找到了和没找到。(没找到直接输出没找到就是了),
假设找到了.
2:移动后面的
for(j=i;j<n;j++)
a[j]=a[j+1];
3:顺序表个数减一
n--;
把上面的各个小部分综合一下;具体代码如下;
/*设有数据集合data={3,2,5,8,4,7,6,9,},无序且无重复值,
目标:给定一个关键字key,在data中删除key*/
#include<stdio.h>
int Delkey(int a[],int n,int key)
{
int i,j;
for(i=0;i<n&&a[i]-key;i++);//查找
if(i==n)//没找到
printf("Not Found!\n");
else//找到了
{for(j=i;j<n-1;a[j]=a[j+1],j++);//key后面的元素前移
n--;//删掉一个元素,顺序表长度减一。
}
return n;
}
int main(void)
{
int i,n=8,key;
int a[8]={3,2,5,8,4,7,6,9};
scanf("%d",&key);
n=Delkey(a,n,key);
for(i=0;i<n;i++)
printf("%5d",a[i]);
return 0;
}
上面那个比较简单,下面来一个稍微的,
/*设数据集合a={3,3,2,5,7,3,3,3,9,8,3,8,6,3,3,}
数据元素含有重复值,要求删掉3*/
#include<stdio.h>
int Delkey(int a[],int n,int key)
{
int i=0,j;
while(i<n)
{
if(a[i]-key)
i++;
else
{
for(j=i;j<n-1;j++)
a[j]=a[j+1];//前移
n--;//元素删一个,顺序表短一截
}
}
return n;
}
int main(void)
{
int i,n=15,key;
int a[15]={3,3,2,5,7,3,3,3,9,8,3,8,6,3,3,};
scanf("%d",&key);
n=Delkey(a,n,key);//普通删除算法
for(i=0;i<n;i++)
printf("%5d",a[i]);
return 0;
}
还有另外一种做法,和想法
//删除要删除的,就是留下要留下的.
//删除要删除的,就是留下要留下的.
//删除要删除的,就是留下要留下的.
#include<stdio.h>
int Delkey(int a[],int n,int key)
{
int i=0,j;
for(i=j=0;i<n;i++)
{
if(a[i]-key)
a[j++]=a[i];//把a[i]存起来,之后a[j]++;
}
return j;//最后顺序表长度就是j。
}
int main(void)
{
int i,n=15,key;
int a[15]={3,3,2,5,7,3,3,3,9,8,3,8,6,3,3,};
scanf("%d",&key);
n=Delkey(a,n,key);//留下
for(i=0;i<n;i++)
printf("%5d",a[i]);
return 0;
}
今天的代码就分享到这里,谢谢大家,我是小纸人。