Questions
Q1动态分配和静态分配的区别
动态分配和静态分配顾名思义:他们是分配方式的不同。 --------静态分配是一经定义,它的大小就无法更改,要想获得更多的存储空间就只能重新定义一个更大的数组。 --------动态分配他的存储空间可以进行变化,如果不够,则可以向内存申请空间,他的存储空间是可变的。
Q2动态分配的特点
特点突出一个“动”字:不够就再申请。
实现方式的区别
动态分配的实现方式大体上和静态的分配方式一致,只是初始化会不一样并且新加了一个方法增加存储空间。
结果截图
C语言源码
#include <stdio.h>
#include <stdlib.h>
typedef struct student{
int * data;
int maxSize;
int length;
}l;
void InitList(l *s,int maxSize){
s->data = (int*) malloc(sizeof(int)*maxSize);
s->maxSize = maxSize;
s->length = 0;
}
void IncreaseSize(l *s,int length){
printf("扩充顺序表的大小%d\n",length);
int *p=s->data;
s->data=(int *)malloc((s->maxSize+length)*sizeof(int));
for(int i=0;i<s->length;i++){
s->data[i]=p[i];
}
s->maxSize += length;
free(p);
}
int ListInsert(l *s,int i,int e){
printf("插入元素:%d ",e);
if(i<1||i>s->length+1){
printf("插入失败%d\n",e);
return 0;
}
if(s->length>=s->maxSize){
printf("插入失败:%d\n",e);
return 0;
}
for(int j=s->length;j>=i;j--)
s->data[j]=s->data[j-1];
s->data[i-1]=e;
s->length++;
return 1;
}
int ListDelete(l *s,int i,int *e){
printf("删除第%d个位置的元素\n",i);
if(i<1||i>s->length)
return 0;
*e=s->data[i-1];
for(int j=i;j<s->length;j++)
s->data[j-1]=s->data[j];
s->length--;
return 1;
}
void PrintList(l *s){
printf("顺序表s长度:%d 大小:%d\n数据元素为:",s->length,s->maxSize);
for(int i=0;i<s->length;i++)
printf("%d ",s->data[i]);
printf("\n");
}
int main()
{
l s;
int e=-2;
InitList(&s,1);
ListInsert(&s,1,1);
ListInsert(&s,2,2);
PrintList(&s);
IncreaseSize(&s,1);
PrintList(&s);
ListInsert(&s,2,2);
PrintList(&s);
IncreaseSize(&s,5);
ListInsert(&s,3,3);
ListInsert(&s,4,4);
ListInsert(&s,5,5);
PrintList(&s);
ListDelete(&s,1,&e);
PrintList(&s);
return 0;
}
一起加油吧!!!
(图片来自于网络)
|