C_数组:元素偏移,元素插入,元素删除

来源:互联网 发布:java虚拟机内存模型 编辑:程序博客网 时间:2024/05/21 19:32

先来一个简单的:
假如有数组:a[10] = {11,22,33,44,55,66,77,88,99},
现在需要插入一个元素70
要求插入以后的造型为:a[10] = {11,22,33,44,55,66,70,77,88,99},

分析:
1,从定义是的造型就可以知道,末尾留了一个位置,默认为0的元素,没写出来。
2,实际上是要把比插入元素值大的元素整体后移一位,腾出一个位置。

那么此时有两种挪法:

方法一:从第一个开始动。

void main(){    int a[10] = {11,22,33,44,55,66,77,88,99},insert_num = 70,i,j,temp;    for(i=0;i<10;i++)    {        if(insert_num <= a[i])        {            temp = a[i];            a[i] = insert_num;            for(j = i+1;j<10;j++)            {                temp = temp^a[j];                a[j] = temp^a[j];                temp = temp^a[j];            }            break;        }    }    for(i=0;i<10;i++)    {        printf("%5d",a[i]);    }    getchar();}

方法二:从最后一个开始动

int main(){    int a[10] = {11,22,33,44,55,66,77,88,99};    int key = 0,i = 0,j = 0,t = 0;    scanf("%d",&key);    getchar();    for(i = 0;i<10;i++)    {        if(a[i]>key)        {            for(j = 9;j>i;j--)            {                a[j] = a[j-1];            }            a[i] = key;            break;        }       }    for(i = 0;i<10;i++)    {        printf("\na[%d] = %d",i,a[i]);    }    getchar();    return 0;}

去掉字符中的数字

void main(){    srand((unsigned)time(NULL));    char ch[13] = "\0", i, j,num;    for (i = 0; i < 12; i++)    {        num = 1 + rand() % 100;        ch[i] = (num <= 50) ? ('a' + rand() % 26) : ('0' + rand() % 10);    }    printf("原始口令为:\t%s",ch);    for (i = 0; i < 12; i++)    {        if (ch[i] >= '0' && ch[i] <= '9')        {            for (j = i; j < 13; j++)            {                ch[j] = ch[j + 1];            }            i--;          //移动以后,还要继续检测当前位置,确保移过来的也是非数字字符        }       }    printf("\n\n删除数字后的口令为:\t%s", ch);    getchar();}

字符串中的数字之前插入美元符

void find_num(char a[], int len, int start);void add_dolar(char a[], int len, int key);void add_dolar(char a[], int len, int key){    int i;    for (i = len; i > key; i--)    {        a[i] = a[i - 1];    //从数字字符开始(包括数字字符),把自己的值复制给后一位,完成整体后移。    }    a[key] = '$';   //此时原来的数字位就腾出来了,将它赋值为‘$’    if (key + 2 != strlen(a))  //此时原来的数字的下标变为了key+1,再加1以后对比此时数组中非空字符的总数,判断它是不是末位    {        find_num(a, strlen(a), key + 2);    //如果不是,就要从该数字的下一位开始,继续查找后面的数字。    }}void find_num(char a[], int len, int start)  //数组,非空字符的个数,检查的起点下标{    int i;    for (i = start; i < len; i++)    {        if (a[i] >= '0'&& a[i] <= '9' && a[i - 1] != '$')   //只有遇到数字,并且数字前面没有加美元符的情况下,才处理        {            add_dolar(a, strlen(a), i);         //找到以后将字符数组,非空字符的个数,数字对应的下标传过去            break;      //因为处理过后的字符串长度发生了改变,所以循环先退出。        }    }}int main(){    srand((unsigned)time(NULL));    char ch[50] = { '\0' };    int i, k;    while (1)    {        for (i = 0; i < 50; i++)        {            ch[i] = '\0';    //字符数组清空,用于循环演示        }        for (i = 0; i < 12; i++)        {            k = rand() % 101 + 1;    //定义一个1-100的随机数,用于概率分配            if (k <= 30)            //大写字母出现概率为30%            {                ch[i] = 'A' + rand() % 26;            }            else if (k >= 30 && k <= 70)   //数字出现概率为40%            {                ch[i] = '0' + rand() % 10;            }            else     //小写出现概率为40%            {                ch[i] = 'a' + rand() % 26;            }        }        printf("\n原始口令:%s\n", ch);        find_num(ch, strlen(ch), 0);        printf("\n升级口令:%s\n", ch);        getchar();    }    system("pause");    return 0;}

这里写图片描述

将数组元素循环往后移动10位

/*定义一个数组a[50],1-100随机赋值,然后将所有元素往后移动10位(如果到了最后一位就移动到第一位,首尾相接的移动方式)*/void main(){    int a[50], i = 0, j = 0, k, temp;    printf("\n偏移前:\n");    for (i = 0; i < 50; i++)    {        a[i] = 1 + rand() % 100;        printf("%-5d", a[i]);        (i % 10 == 9) ? printf("\n") : NULL;    }    for (j = 0; j < 10; j++)    {        temp = a[0];        for (i = 0; i < 49; i++)        {            temp = temp^a[i + 1];            a[i + 1] = temp^a[i + 1];    //从前往后挪            temp = temp^a[i + 1];           }        a[0] = temp;        }    printf("\n偏移后:\n");    for (i = 0; i < 50; i++)    {        printf("%-5d", a[i]);        (i % 10 == 9) ? printf("\n") : NULL;    }    getchar();}