给定一个数组,删除数组中指定的元素
方法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;
}
运行结果: