//定义顺序表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. Linux CentOS7 VMware克隆、虚拟机之间互连——初学笔记

    一.VMware克隆:选中我的第一个虚拟机,右键下拉菜单—管理—克隆. 弹出对话框,下一步根据提示:             完成克隆: 二.虚拟机互连: 配置第二虚拟机IP,使用:vi /etc/s ...

  2. CH12 动态内存

    动态分配的对象的生命期与它们在哪里创建的五官,只有显示地释放时,这些对象才被销毁 静态内存用来保存局部static对象.类static数据成员以及定义在任何函数之外的变量,栈内存用来保存定义在函数内的 ...

  3. Day3-G - Task HDU4864

    Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this ...

  4. 「CF5E」Bindian Signalizing

    传送门 Luogu 解题思路 很显然的一点,任何一条可能成为路径的圆弧都不可能经过最高的点,除非这条路径全是最高点. 所以我们先把最大值抠掉,把剩下的按原来的顺序排好. 从前往后.从后往前扫两次,用单 ...

  5. SpringBoot 入门demo

    创建SpringBoot项目方式一 (1)新建maven项目,不使用骨架. 使用maven管理依赖就行了,不必使用骨架(模板). (2)在pom.xml中添加 <!--springboot核心. ...

  6. Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API.

    /** * Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API. <br> * 1.不得使用任何API,如Math.abs()等.<br> * 2.不得使用判断 ...

  7. texlive 安装

    texlive 可以从下面两个网址下载 https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/ https://mirror ...

  8. 二 配置数据字典&异步查询客户

    数据字典: 字典表和客户表的关系 配置字典表 配置客户表 Spring管理映射文件 1 字典表和客户表的关系 2 配置字典表 3  配置客户表 4  Spring管理映射文件 异步查询客户: 页面加载 ...

  9. Arm-Linux 移植 Ubuntu

    前言: 这篇文章介绍如何构建一个完整基于ARM的Ubuntu系统. 由于改文章当初写的时候是发表在国外产品论坛上面,故保留了原文内容. 使用到的硬件平台:Geekbox 补充说明: 虽然Geekbox ...

  10. ElasticSearch学习,入门篇(一)

    概念解析 1.什么是搜索 搜索就是在任何场景下,找寻你想要的信息,这个时候你会输入一段要搜索的关键字,然后期望找到这个关键字相关的有效信息. 2.如果用数据库做搜素会怎么样 select * from ...