删除数组指定的元素(难度:半颗星)

给定一个数组,删除数组中指定的元素

方法1:
把不等于要删除的数全部按照顺序从0开始排起,最后改变原数组的长度即可

参考代码:

#include<stdio.h>

void DeleteElementFromArray(int *pArray, int* pnCount, int nDeleteNum)
{//思路:把不等于要删除的数全部按照顺序从0开始排起,最后改变原数组的长度即可
    int i, nIndex = 0;
    for (i = 0; i < *pnCount; i++)
    {
        if (pArray[i] != nDeleteNum)
            pArray[nIndex++] = pArray[i];
    }
    *pnCount = nIndex;
}

int main()
{
    int arr[] = { 1, 2, 1, 4, 5, 7, 8, 1 };
    int i, nCount = sizeof(arr) / sizeof(arr[0]);
    printf("删除前\n");
    for (i = 0; i < nCount; i++)
        printf("%d ", arr[i]);
    printf("\n");

    DeleteElementFromArray(arr, &nCount, 1);

    printf("删除后\n");
    for (i = 0; i < nCount; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

方法2:
遇到等于要删除的数,把后面的数往前移动

参考代码:

#include<stdio.h>

void DeleteElementFromArray(int *pArray, int* pnCount, int nDeleteNum)
{//思路:遇到等于要删除的数,把后面的数往前移动
    int i, j;
    for (i = 0; i < *pnCount; i++)
    {
        if (pArray[i] == nDeleteNum)
        {
            for (j = i + 1; j < *pnCount; j++)
                pArray[j - 1] = pArray[j];
            (*pnCount)--;
            i--;
        }
    }
}

int main()
{
    int arr[] = { 1, 2, 1, 4, 5, 7, 8, 1 };
    int i, nCount = sizeof(arr) / sizeof(arr[0]);
    printf("删除前\n");
    for (i = 0; i < nCount; i++)
        printf("%d ", arr[i]);
    printf("\n");

    DeleteElementFromArray(arr, &nCount, 1);

    printf("删除后\n");
    for (i = 0; i < nCount; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

方法3:
申请一个临时的数组保存一下不等于nDeleteNum,然后把它放回到原来的数组

参考代码:

#include <stdio.h>
#include <malloc.h>

void DeleteElementFromArray(int *pArray, int* pnCount, int nDeleteNum)
{//思路:申请一个临时的数组保存一下不等于nDeleteNum,然后把它放回到原来的数组
    int i, nTempCount = 0;
    int *pTemp = (int*)malloc(100 * sizeof(int));
    for (i = 0; i < *pnCount; i++)
    {
        if (pArray[i] != nDeleteNum)
            pTemp[nTempCount++] = pArray[i];
    }
    for (i = 0; i < nTempCount; i++)
        pArray[i] = pTemp[i];
    *pnCount = nTempCount;
    free(pTemp);
}

int main()
{
    int arr[] = { 1, 2, 1, 4, 5, 7, 8, 1 };
    int i, nCount = sizeof(arr) / sizeof(arr[0]);
    printf("删除前\n");
    for (i = 0; i < nCount; i++)
        printf("%d ", arr[i]);
    printf("\n");

    DeleteElementFromArray(arr, &nCount, 1);

    printf("删除后\n");
    for (i = 0; i < nCount; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

方法4:
不删除只做标记,根据标记输出

参考代码:

#include <stdio.h>
#include <malloc.h>
#include <memory.h>

int main()
{
    int arr[] = { 1, 2, 1, 4, 5, 7, 8, 1 };
    int i, nCount = sizeof(arr) / sizeof(arr[0]);
    int *pFlag = (int*)malloc(nCount * sizeof(int));
    memset(pFlag, 0, nCount * sizeof(int));
    printf("删除前\n");
    for (i = 0; i < nCount; i++)
        printf("%d ", arr[i]);
    printf("\n");

    for (i = 0; i < nCount; i++)//不删除只做标记,根据标记输出
        if (1 == arr[i])
            pFlag[i] = 1;

    printf("删除后\n");
    for (i = 0; i < nCount; i++)
    {
        if (0 == pFlag[i])
            printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

方法5:
用单链表进行周转,因为单链表进行节点删除,时间复杂度为O(1)

参考代码:

#include<stdio.h>
#include <malloc.h>

typedef struct NODE
{
    int data;
    struct NODE *pNext;
}Node;

void DeleteElementFromArray(int *pArray, int* pnCount, int nDeleteNum)
{//思路:用单链表进行周转,因为单链表进行节点删除,时间复杂度为O(1)
    int i, nIndex = 0;
    Node *head, *p, *s;
    head = (Node*)malloc(sizeof(Node));
    head->data = 0;
    head->pNext = NULL;
    p = head;//先初始化一个空节点,该节点的主要目的是为了删除第一个元素
    for (i = 0; i < *pnCount; i++)
    {
        s = (Node*)malloc(sizeof(Node));
        s->data = pArray[i];
        s->pNext = NULL;
        p->pNext = s;
        p = s;
    }
    p = head;
    s = p->pNext;
    while (s)
    {//删除元素
        if (s->data == nDeleteNum)
        {
            p->pNext = s->pNext;
            free(s);
            s = p->pNext;
        }
        else
        {
            p = s;
            s = s->pNext;
        }
    }
    p = head->pNext;
    while (p)
    {//一个一个push到原来的数组中
        pArray[nIndex++] = p->data;
        p = p->pNext;
    }
    *pnCount = nIndex;//改变原来数组的长度
}

int main()
{
    int arr[] = { 1, 2, 1, 4, 5, 7, 8, 1 };
    int i, nCount = sizeof(arr) / sizeof(arr[0]);
    printf("删除前\n");
    for (i = 0; i < nCount; i++)
        printf("%d ", arr[i]);
    printf("\n");

    DeleteElementFromArray(arr, &nCount, 1);

    printf("删除后\n");
    for (i = 0; i < nCount; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

运行结果:

这里写图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值