数据结构顺序表中Sqlist *L,&L,Sqlist *&L
//定义顺序表L的结构体
typedef struct
{
Elemtype data[MaxSize];
int length;
}SqList; //建立顺序表
void CreateList(SqList * &L,ElemType a[ ],int n)
{
int i;
L = (SqList * )malloc(sizeof(SqList));
for(i = ; i < n ; i++)
L->data[i] = a[i];
L->length = n;
}
//输出线性表:
void DispList(SqList *L)
{
int i;
for(i = ; i < L ->length; i++)
printf(“%d”,L->data[i]);
printf(“\n”);
}
思考这个形参为什么要写成这两种形式,即SqList *L和SqList * &L的区别。
*L是指针,全称是指针变量,是一个用来保存内存地址的变量。在这里是一个指向顺序表,存储顺序表的地址的变量。
* &L是指针类型的引用,引用(reference)是c++对c语言的重要扩充。引用就是原变量的另外一个名称(别名),引用变量本身没有自己的实际存储空间,对引用变量的操作,就是在操作原变量。这里的* &L代表原指针。
这两个有着一个共同点,都指向顺序表 L ,如果在函数中修改L 的内容,都影响到 L 的内容。
不同点则是,在函数中修改指针本身所指向的地址,*L 不会发生改变,而* &L会发生改变。
若要改变形参中的内容并且使用它则需要用引用,如果不需要改变子函数体中形参旳值,则不需要用引用。
首先,* &L是引用类型的指针,代表的是原指针,我们在函数中对指针的操作,都是直接对原指针的操作,无论是指针的内容,还是指针指向的地址,都会发生改变。
那么,*L为什么在函数中会改变不了所指向的地址呢?
其实,这里我们要延伸到函数形式参数和实际参数的很基础,也很重要的知识点了。
形参出现在函数定义中,在整个函数体内都可以使用。实参出现在主调函数中,进入被调函数后,实参也不能使用。在函数调用的时候,主函数把实参的值传送给被调函数的形参,从而实现数据的传送。
但是,在这个函数调用的过程中,数据传送是单向的,即数据只能由实参传到形参,而形参不会传回实参。也就是说,我们在函数中改变形参的值,实参的值是不会发生改变的,这就是函数调用中的单向值传递。
那么,回到我们的 *L 来,*L其实就是一个变量,在这里是一个形式参数。形式参数在函数中其实是对实参的拷贝,也就是说,函数中形参其实是另一个变量,一个复制原变量的新变量,有不同于原变量的内存空间,存在于函数中,函数调用结束,即刻释放内存空间。
也就是说,我们在函数中改变 *L 所指向的地址,不是在对原变量进行改变,而是对原变量的一个复制体进行改变,改变了复制体,却没有改变本体。
所以,在函数中 *L 不能改变所指向的地址。
#include<stdio.h>
#include<stdlib.h>
#define maxSize 10//定义整型变量值为10
typedef struct{
int data[maxSize];
int length;
}Sqlist; void main(){
Sqlist L;
int n;
//&L表示实参,是一个变量的地址
initList(&L);
//
printf("请输入元素个数");
scanf("%d",n);
createList(&L,n);
} - //初始化顺序表,顺序表本身需要发生改变
// *L是一个形参,参数类型是Sqlist类型的指针
void initList(Sqlist *L){
(*L).length = ;//当前长度置零,空的
printf("初始化参数成功");
} //插入数据,p表示插入位置,e表示插入数值
int insertElem(Sqlist *L,int p,int e){
int i;
// 越界,满了
if(p<||p>(*L).length||(*L).length==maxSize){
return ;
}
// 位置p和p后面的元素往后移
for(i=(*L).length-;i>=p;i--){
// 疑惑这里i+1,不会越界吗?
(*L).data[i+] = (*L).data[i];
}
// 腾出位置,赋值
(*L).data[p]=e;
++((*L).length);
return ;
} //创建顺序表 *L指针
void createList(Sqlist *L,int n){
int i,num;
for(i =;i<n;i++){
printf("请输入第,%d,个整数",i+);
scanf("%d",&num);
// *L取值
(*L).data[i]=num;
(*L).length++;
}
}
数据结构顺序表中Sqlist *L,&L,Sqlist *&L的更多相关文章
- 设顺序表中的数据元素递增有序,试着写一算法,将x插入到顺序表上的适当位置上,以保持该表的有序性。
原创,转载请注明出处.https://www.cnblogs.com/yangf428/p/11254370.html 天勤例题[2-1]: 设顺序表va中的数据元素递增有序.试写一算法,将x插入到顺 ...
- 数据结构 - 顺序表 C++ 实现
顺序表 此处实现的顺序表为**第一个位置为 data[0] **的顺序表 顺序表的定义为 const int MAX = 50; typedef int ElemType; typedef struc ...
- c数据结构 顺序表和链表 相关操作
编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
- hrbust-1545-基础数据结构——顺序表(2)
http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...
- 数据结构顺序表Java实现
Java实现顺序表算法:1:首先我们需要定义我们的接口,关于顺序表的一些基本的操作:顺序表中的操作都有增删改查. //List接口 public interface IList { //返回线性表的大 ...
- python算法与数据结构-顺序表(37)
1.顺序表介绍 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入.删除时需要移动大量元素.顺序表可以分配一段连续的存储空间 ...
- 数据结构——顺序表(sequence list)
/* sequenceList.c */ /* 顺序表 */ /* 线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表中的各项数据元素,用这种存储形式的线性表称为顺序表. */ #in ...
- Java数据结构——顺序表
一个线性表是由n(n≥0)个数据元素所构成的有限序列. 线性表逻辑地表示为:(a0,a1,…,an-1).其中,n为线性表的长度,n=0时为空表.i为ai在线性表中的位序号. 存储结构:1.顺序存储, ...
随机推荐
- 关于Burp Suite Intruder 的四种攻击方式
以下面这一段参数为例,被§§包围的部分为需要破解的部分: user=§ss§&password=§zxcv§&imageField.x=17&imageField.y=1 (1 ...
- 2.13 阶段实战 使用layui重构选课系统
一.说在前面 昨天 学习表单校验插件validate,并使用ajax 自定义校验规则 今天 使用layui重构选课系统 二.题目要求 1.项目需求: 本项目所开发的学生选课系统完成学校对学生 ...
- C语言版数据结构算法
C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu ...
- ROS常用库(二) Serial库(单片机和上位机串口通讯)
比如我们做了个单片机,在win里面用串口调试助手接收和下发数据,那么在ubuntu里用ros怎么实现?换个说法,怎么实现上位机和下位机的通讯? 首先,用python自带的库就可以实现这个功能. 安装p ...
- crashpad 应用程序异常解决方案
衡量某个应用程序的稳定性的一个重要指标即它自身的崩溃率的统计,但是如何判断应用程序崩溃,且上报崩溃产生的dmp文件进行分析? google提供了一套开源的系统 Crashpad,详细了解参见 http ...
- 015.Oracle数据库,取本月月初,取本月月末
/*取本月月初,取本月月末*/ SELECT trunc( SYSDATE, 'mm' ) AS 月初 , last_day(trunc(sysdate)) AS 月末 FROM dual; 修改如下 ...
- I0.0 上升边沿 清空 MW10~MW58 联系多个知识点融合
编写程序 在I1.2 的上升边沿 触发 MW8+1的程序 实现方式1 M1.1 为中间变量 对应的STL语句表 执行结果 OK 已经仿真 . 现在尝试第2种方法 实现方式2: M1.1也是中间变量 S ...
- 循环指令 LOOP
循环程序: 如果需要重复执行若干次同样任务.用循环执行 循环指令: LOOP <跳转标号> 用累加器的低字做循环计数器 每次执行LOOP 指令的时候,累加器的低字减去1 若减去后 非零 , ...
- ffmpeg “inttypes.h”: No such file or directory
编译过程:错误一:无法打开包括文件:“inttypes.h”: No such file or directory解决方法:删除之,并在其之前添加如下代码: #if defined(WIN32) &a ...
- 指定盘符获取u盘PID、VID、序列号等信息
最近学习scsi和DeviceIoControl,下载了微软WDK一些例子,以下代码精简自Windows-driver-samples-master\storage\tools\spti\src\sp ...