结构体Sqlist L与Sqlist &L的区别
结构体Sqlist L与Sqlist &L的区别
Sqlist &L只可用于c++中;其中&表示引用的意思,而在C中&只表示取址,因此C++中下列顺序表插入函数中的L实际就是原结构体
1.证明Sqlist &L就是k:
bool ListInsert(SeqList &L,int i,ElemType e){
if(i<1||i>L.length+1)
return false;
if(L.length>=L.MaxSize)
return false;
for (int j=L.length;j>=i;j--)
L.data[j]=L.data[j-1];
L.length++;
L.data[i]=e;
printf("%%p
",&L);//对L取地址打印
return true;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
证明,将ListInsert函数中的L进行取地址,将原结构体取址对比
int main(){
SeqList k;
int i=0,e=0;
k.data=(ElemType *)malloc(sizeof(ElemType)*InitSize);
k.MaxSize=20;
while(i!=15){
k.data[i]=i;
printf("%%d ",k.data[i]);
i++;
}
k.length=i;
printf("%%p
",&k); //原结构体地址
printf("please input the number and the position that you want to insert:
");
scanf("%%d%%d",&i,&e);
if((ListInsert(k,i,e))==true){
printf("it is succeed and the result is:
");
for (int j=0;j<k.length;j++)
printf("%%d ",k.data[j]);
printf("%%p
",&k);//插入操作后 原结构体地址
}
else{
printf("Sorry ,insert is false!!!");
}
free(k.data);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
运行结果
可见插入前 插入后和函数中的L地址都是同一个,得证&L就是结构体k;
2.证明Sqlist L与原结构体并非同一结构体但是具有回传功能。
对ListInsert 函数稍作修改
bool ListInsert(SeqList L,int i,ElemType e){
if(i<1||i>L.length+1)
return false;
if(L.length>=L.MaxSize)
return false;
for (int j=L.length;j>=i;j--)
L.data[j]=L.data[j-1];
L.length++;
L.data[i]=e;
printf("%%p
",&L);//打印L地址
for (int j=0;j<L.length;j++)//打印L数据
printf("%%d ",L.data[j]);
return true;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
运行结果
可见结构体K的地址插入前后并没有发生变化,而函数ListInsert的参数的结构体L地址却与k不同,证面Sqlist L是一个与原结构体相同的结构体,
如果采用该形式进行结构体修改,插入等操作时 ,当结构体数据量大时会增加电脑的额外开销。
结论: 记得点赞收藏