//定义顺序表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的更多相关文章

  1. 设顺序表中的数据元素递增有序,试着写一算法,将x插入到顺序表上的适当位置上,以保持该表的有序性。

    原创,转载请注明出处.https://www.cnblogs.com/yangf428/p/11254370.html 天勤例题[2-1]: 设顺序表va中的数据元素递增有序.试写一算法,将x插入到顺 ...

  2. 数据结构 - 顺序表 C++ 实现

    顺序表 此处实现的顺序表为**第一个位置为 data[0] **的顺序表 顺序表的定义为 const int MAX = 50; typedef int ElemType; typedef struc ...

  3. c数据结构 顺序表和链表 相关操作

    编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...

  4. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

  5. hrbust-1545-基础数据结构——顺序表(2)

    http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...

  6. 数据结构顺序表Java实现

    Java实现顺序表算法:1:首先我们需要定义我们的接口,关于顺序表的一些基本的操作:顺序表中的操作都有增删改查. //List接口 public interface IList { //返回线性表的大 ...

  7. python算法与数据结构-顺序表(37)

    1.顺序表介绍 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入.删除时需要移动大量元素.顺序表可以分配一段连续的存储空间 ...

  8. 数据结构——顺序表(sequence list)

    /* sequenceList.c */ /* 顺序表 */ /* 线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表中的各项数据元素,用这种存储形式的线性表称为顺序表. */ #in ...

  9. Java数据结构——顺序表

    一个线性表是由n(n≥0)个数据元素所构成的有限序列. 线性表逻辑地表示为:(a0,a1,…,an-1).其中,n为线性表的长度,n=0时为空表.i为ai在线性表中的位序号. 存储结构:1.顺序存储, ...

随机推荐

  1. flutter 启动时一直Resolving dependencies...

    原因:国内网无法从Google获取资源,貌似搭了梯子也没用 修改flutter sdk Path/packages/flutter_tools/gradle/flutter.gradle这个文件,使用 ...

  2. 「NOIP2011」观光公交

    传送门 Luogu 解题思路 有点麻烦,幸好 \(O(n^2)\) 能过... 贪心地想一想,我们如果要用加速器,肯定是要选择车上人数最多的时段加速. 但是我们就会面临这样的情况: 加速了,带来了增益 ...

  3. hadoop 第一个 mapreduce 程序(对MapReduce的几种固定代码的理解)

    1.2MapReduce 和 HDFS 是如何工作的 MapReduce 其实是两部分,先是 Map 过程,然后是 Reduce 过程.从词频计算来说,假设某个文件块里的一行文字是”Thisis a ...

  4. 手动搭建Vue之前奏:搭建webpack项目

    手动搭建vue项目 搭建vue前首先搭建webpack项目 首先你应当安装一下npm以及nodejs 安装完成后,进行如下操作: // 创建项目根目录 mkdir some_project_name ...

  5. greenplum 导入数据方式

    参考: http://gpdb.docs.pivotal.io/4390/admin_guide/load/topics/g-working-with-file-based-ext-tables.ht ...

  6. P1076 Wifi密码

    P1076 Wifi密码 转跳点:

  7. 洛谷 P4391 [BOI2009]Radio Transmission 无线传输

    题目传送门 解题思路: 本题所要求的循环节,其实就是最长公共前缀的前缀长度减去前后缀重叠的一部分 AC代码: #include<iostream> #include<cstdio&g ...

  8. 解决使用xampp无法通过ip访问的问题

    本地能通过127.0.0.1或者localhost访问,无法通过外网地址访问: win解决防火墙问题: 1.进入控制面板 -> 系统和安全 -> 2.window防火墙 - 允许其他程序通 ...

  9. Oracle 建库

    Oracle得安装就不多说了 不过还是建议直接去官网下  其他渠道可能会导致安装问题  具体自己慢慢体会吧  !  下面主要说下怎么用Oracle建库并且建用户角色 Database configur ...

  10. CentOS7安装Jenkins与配置

    安装 将Jenkins存储库添加到yum repos,并从此安装Jenkins. sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenki ...