用C语言实现可添加删除元素的数组(两种方式,数组和指针)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43701019/article/details/99546686

——个人笔记

  • 这对于初学C的人来说,是一个比较有意思的问题。要运用到的知识点比较全面,方法也比较实用

数组思路

  • 这个只是个人思路,如果你想到更好的不妨试试。首先由于C没有动态数组,那么我们就声明一个int类型范围比较大的数组,比如 int array[1000]。那么我们要知道里面存放多少个元素,要怎么获取呢?直接用sizeof(array)/sizeof(array[0])是获取到这个数组的容量大小,而不是元素多少。那么我们要有一个标记,记录当前元素的个数(声明int len=0;)。添加就是我们要添加一个元素,就把array[len]=该元素,然后len++就实现了添加功能。删除就是查找数组(遍历数组)找到与要删除相同的元素那么就删除而且len--输出就是循环i从0开始,到i<len输出就行了。要实现一直能输入,只要把我们做好的功能放到一个死循环进行就可以了。

数组实现

  • 上面的思路懂了,可能还是一脸懵逼不知道怎么写。
    那么从最简单的入手,先定义我们需要的变量

    int array[1000] = { 0 };//我们要用的数组
    int len = 0;//标记,记录当前元素个数
    int choice;//我们要进行的操作
    int input;//输入增加或者删除的元素
    
    //这个是阐述这个编程的功能按键,放在这里是不想再下面写那么多。
    printf("请输入你要的操作\n--1--添加元素\n--2--删除元素\n--3--输出元素和有多少元素\n--4--退出程序\n");
    
  • 如果一开始漏了一些需要用到的变量的定义也无所谓,我们在实现的时候再补上就行。
    开始编写内容:

  • 要可以选择多种操作,我们可以想到分支(switch)那么我们就有一个整体框架了(退出操作要在死循环才要处理,比如输入4结束(while(1){if(choice==4)break;})或者在case 4:return;也行)

    switch (choice)
    		{
    		case 1:
    			printf("请输入要添加的元素:\n");
    			 //TODO 要进行添加操作
    		case 2:
    			printf("请输入要删除的元素:\n");
    			//TODO进行删除操作
    			break;
    		case 3:
    			printf("数组总共有%d个元素:\n", len);
    			//这里我就不详细讲了,查询操作
    			for (int i = 0; i < len; i++)
    			{
    				printf("%d ", array[i]);
    			}
    			printf("\n");
    			break;		 
    		default:
    			break;
    		}		 
    
  • 理解后,我们只要补充TODO的部分就行了
    添加元素:

    //放在cese 1下面
    scanf("%d", &input);
    array[len] = input;
    len++;
    
  • 删除元素:

    //放在case 2下面
    scanf("%d", &input);
    for (int i = 0; i < len; i++)
    {
    	if (array[i] == input)//检测到是要删除的元素
    	{
    		for(int j=i;j<len-1;j++)//把数组前移,覆盖了要删除的元素
    		{
    			array[j] = array[j + 1];
    		}
    		len--;//标记前移,相当于删除了最后一个位置
    		i--;//这个为什么要减呢?别急,下面会讲,先懂得上面数组和标记前移为啥能删除元素
    	}
    }
    printf("\n");
    

    上面为什么检测到要删除的元素,删除之后,需要把i也减去1呢?你可以看到大循环里面,我们结束条件是i<len,但是删除元素的时候(里面的循环)len会–,而我们当前检测到的位置已经变成了后面的元素了,所以要重新检测当前位置。你可以尝试一下不要i--;这一句,一般情况下还是正确的,只是如果出现连续相同的元素那么你就会出错,比如你连续添加了6个1,现在你按3输出数组,那么是1 1 1 1 1 1,然后你删除元素1,会怎么?再加上i--;,再运行试一下。你自己模拟一下你是计算机,用纸笔模拟一下哈哈!不理解再想想,完整代码应该不需要了吧,不懂再问!

指针思想

  • 虽然C没有动态数组,但是我们可以申请连续的空间,每次增加就重新申请,从而实现动态,其余思路和数组思路差不多一样。

指针实现

  • 同样我们先想一下要什么全局变量

    int *p = NULL;
    int size = 0; //记录长度
    int choice;
    
  • 整体框架

    while (1)
    	{
    		printf("请输入你要的操作\n--1--添加元素\n--2--删除元素\n--3--输出元素和有多少元素\n--4--退出程序\n");
    		scanf("%d", &choice);
    		switch (choice)
    		{
    		case 1:
    			insert();//插入
    			break;
    		case 2:		 
    			delert();//删除,为啥不命名delete,因为是关键词
    			break;
    		case 3:
    			printAll();//输出
    			break;
    		case 4:
    			return 0;
    		break;
    		default:
    			break;
    		}
    		 
    	}
    
  • 添加元素

    void insert()
    {
    	printf("请输入要添加的元素:\n");
    	int input;
    	scanf("%d", &input);
    	//申请空间要用realloc,因为malloc是用于第一次申请新的空间,而要改动就要用realloc
    	p = (int)realloc(p, sizeof(int)*(size+1));//先申请扩大再放入,这里理解一下就是
    	                                          //你要先申请空的位置才能放东西
    	*(p + size) = input;
    	size++;
    }
    
  • 删除元素

    void delert()
    {
    	printf("请输入要删除的元素:\n");
    	int input;
    	scanf("%d", &input);
    	for (int i = 0; i < size; i++)
    	{
    		if (*(p+i) == input)
    		{
    			for (int j = i; j < size - 1; j++)
    			{
    				*(p+j) = *(p+j + 1);
    			}
    			p= (int)realloc(p, sizeof(int)*(size - 1));//先移动再缩小,你要清理了东西
    			                                           //才能减少空间
    			size--;
    			i--;
    		}
    	}
    }
    
  • 输出元素

    void printAll()
    {
    	printf("数组总共有%d个元素:\n", size);
    	for (int i = 0; i < size; i++)
    	{
    		printf("%d ",*(p + i));
    	}
    	printf("\n");
    }
    

猜你喜欢

转载自blog.csdn.net/weixin_43701019/article/details/99546686
今日推荐