顺序表删除

前面我们学会了,顺序表的移动问题。

        删除无非就是找到这个元素把他后面的移动到前面来,然后再个数减一就完成了。    

        所以呢,分三步.

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;

今天的代码就分享到这里,谢谢大家,我是小纸人。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭