——个人笔记
- 这对于初学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"); }