链表【9-1-3】 链表与数组的比较
来源:互联网 发布:php最新面试题 编辑:程序博客网 时间:2024/06/15 12:47
静态数组优点是查询和修改方便,增加和删除难些,缺点在于第一处理不了大的数据,第二不能越界访问,也就是一旦固定了就没有办法变长,第三删除和增加非常麻烦。
动态数组,函数realloc会重新分配内存,可以处理大数据,每次增加一个人,需要重新分配内存,移动数据,每次删除一个人,需要移动很多数据,非常浪费计算机资源,数组的局限性,我们就需要用到链表,链表就不需要realloc这样的机制,就不用每次重新分配内存,不用移动数据
【静态数组的增删改查】
练习1
数据结构用来存储数据。从增删查改分析数组和链表
练习1:数组分2种,静态数组和动态数组
静态数组:对于这个有10个元素的数组,我们分别进行增删查改,看有什么缺点?
首先想想,作为一个静态数组,可不可以变长呢?答案:作为静态数组,无法变长,一旦分配内存,就固定了,也不可以增加
数组在内存里面按照线性排列,看看数组可不可以变长呢?
a[n]=*(a+n);从数组名首地址开始,往下寻址,取出内容,数组不会检测越界,偶然会成功,但是偶然的成功比必然的失败更可怕,数组不可以越界。
举例:
void main1()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%p",a);
a[10] = 1;//数组越界
a[1222] = 22;
system("pause");
}
练习2:静态数组不可以处理较大的数据
void main2()
{
int a[1024*1024*10] ;//出现问题栈溢出,静态数组在栈上,默认的栈最大是1M,
system("pause");
}
练习3;在数组里面实现较大的删除怎么做呢?
//每当删除一个元素,必须移动好多个元素,数组好坑
void main3()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
//此时此刻,要把4 删除怎么做?
//要删除的时候,我们要有一值,来保留数组的长度
int length = sizeof(a) / sizeof(int);//数组的长度
for (int i = 0; i < length;i++)//打印数组
{
printf("%d\n",a[i]);
}
int num = 4;
int num = 4;//如果发现某个元素等于4,我们就把它删除
//尾部删除
if (num==a[9])//检测最后一个
{
length = length - 1;//删除一个元素,元素在末尾
}
for (int i = 0; i < length - 1;i++)//检测最后一个之前的
{
if (a[i]==num)//从删除的位置开始,到最后一个全部向前移动
{
for (int j = i; i < length - 1;j++)
{
a[i] = a[j + 1];//挨个向前移动赋值
}
length = length - 1;//删除一个元素,元素在末尾
break;//跳出循环
}
}
printf("尾部删除以后\n");
for (int i = 0; i < length; i++)//打印数组
{
printf("%d\n", a[i]);
}
system("pause");
}
练习4:数组查询
void main4()
{
//每当删除一个元素,必须移动好多个元素,数组好坑
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//来保留数组的长度
int length = sizeof(a) / sizeof(int);//数组的长度
for (int i = 0; i < length; i++)//挨个访问数组每个元素
{
if (a[i] == 7)//查询
{
printf("找到");
break;//跳出循环
}
}
system("pause");
}
练习5:数组修改
//把7改成9
void main()
{
//每当删除一个元素,必须移动好多个元素,数组好坑
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//来保留数组的长度
int length = sizeof(a) / sizeof(int);//数组的长度
for (int i = 0; i < length; i++)//挨个访问数组每个元素
{
if (a[i] == 7)//查询
{
printf("找到\n");
a[i] = 9;
break;//跳出循环
}
}
for (int i = 0; i < length; i++)//打印数组
{
printf("%d\n", a[i]);
}
system("pause");
}
【2】动态数组的增删改查
练习6:动态数组的简介
void main1()
{
int *p = (int *)malloc(sizeof(int)*10);//调用malloc函数动态分配内存
//如何对这个动态数组进行初始化并打印
for (int i = 0; i < 10;i++)
{
p[i] = i;//初始化
printf("%d\n",p[i]);//打印数据
}
system("pause");
}
练习7:动态数组优点可以处理海量内存
void main7()
{
int *p = (int *)malloc(sizeof(int)* 1024*1024*256);//1G
system("pause");
}
练习8;动态数组的查询
//动态数组的查询,如果某个数等于6,我们把它找出来
void main111()
{
int *p = (int *)malloc(sizeof(int)*10);//调用malloc函数动态分配内存
//如何对这个动态数组进行初始化并打印
for (int i = 0; i < 10;i++)
{
p[i] = i;//初始化
printf("%d\n",p[i]);//打印数据
}
for (int i = 0; i < 10;i++)
{
if (p[i]==6)
{
printf("找到");
}
}
system("pause");
}
//动态数组的修改,如果某个数等于6,我们把它改成16
void main111()
{
int *p = (int *)malloc(sizeof(int)*10);//调用malloc函数动态分配内存
//如何对这个动态数组进行初始化并打印
for (int i = 0; i < 10;i++)
{
p[i] = i;//初始化
printf("%d\n",p[i]);//打印数据
}
for (int i = 0; i < 10;i++)
{
if (p[i]==6)
{
p[i] = 16;
printf("修改以后\n");
}
}
system("pause");
}
动态数组的删除
//修改,如果某个数等于6,我们把它改成16
void main111()
{
int *p = (int *)malloc(sizeof(int)*10);//调用malloc函数动态分配内存
//如何对这个动态数组进行初始化并打印
for (int i = 0; i < 10;i++)
{
p[i] = i;//初始化
printf("%d\n",p[i]);//打印数据
}
int length = 10;//标记数组的长度
int num = 9;//计划删除num=9这个数据
//int num = 4;//如果发现某个元素等于4,我们就把它删除
//尾部删除
if (num == p[9])//检测最后一个
{
length = length - 1;//删除一个元素,元素在末尾
}
for (int i = 0; i < length - 1; i++)//检测最后一个之前的
{
if (p[i] == num)//从删除的位置开始,到最后一个全部向前移动
{
for (int j = i; i < length - 1; j++)
{
p[i] = p[j + 1];//挨个向前移动赋值
}
length = length - 1;//删除一个元素,元素在末尾
break;//跳出循环
}
}
printf("尾部删除以后\n");
for (int i = 0; i < length; i++)//打印动态数组
{
printf("%d\n", p[i]);
}
system("pause");
}
动态数组的增加
void main111()
{
int *p = (int *)malloc(sizeof(int)*10);//调用malloc函数动态分配内存
//如何对这个动态数组进行初始化并打印
for (int i = 0; i < 10;i++)
{
p[i] = i;//初始化
printf("%d\n",p[i]);//打印数据
}
//动态数组的拓展,需要用到一函数realloc,重新分配内存
int length = 10;//动态数组的长度
int num = 10;//插入的元素为10
int *px = realloc(p,sizeof(int)*(length+1));//重新分配内存,多开拓一个元素的大小
length += 1;//长度加1
px[10]= num;
printf("变长以后的数组\n");
for (int i = 0; i < length;i++)
{
printf("%d\n",px[i]);//打印数据
}
system("pause");
}
- 链表【9-1-3】 链表与数组的比较
- 数组与链表的比较
- 链表与数组之比较
- 指针与数组的比较
- 指针与数组的比较
- 数组指针与指针数组的比较
- 数组和链表的优缺点比较
- 性能的比较:数组与ILIST
- 索引器与数组的比较
- C++ 数组array与vector的比较
- java中数组的比较与排序
- C++ 数组array与vector的比较
- C++ 数组array与vector的比较
- ArrayList与一般数组的比较
- C++ 数组array与vector的比较
- 比较指针与数组的特性
- C++ 数组array与vector的比较
- Java 中Map与数组的比较
- 基于视觉的网页结构相似性计算
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
- Swift3.0 shadowColor
- 判断链表是否有环---leetcode题目
- HDFS文件操作命令格式-注意事项
- 链表【9-1-3】 链表与数组的比较
- ssh 免密码登录
- jQuery中给文本框获得焦点和失去焦点的方法
- vs2012打开vs2013的项目
- 建造者模式
- android ---Activity生命周期
- Session机制详解
- linux设备驱动之POLL机制
- 个人记录-LeetCode 49. Group Anagrams