链表【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");
}

0 0
原创粉丝点击