C语言*与&在操作线性表的作用详解

在数据结构线性表一章,对线性表有这些操作方法(Operation):

/*Operation*/

Initlist(*L);/*初始化操作,建立一个空的线性表L*/

ListEmpty(L);/*判断线性表是否为空表,若线性表为空,返回值为true,否则返回false*/ 

ClearList(*L);/*将线性表清空*/

GetElem(L,i,*e);/*性表L中的第i个位置元素值返回给e*/

LocateElem(L,e);/*在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号;否则,返回0表示失败*/

ListInsert(*L,i,e);/*在第i个位置插入元素e*/

ListDelete(*L,i,*e);/*删除i个位置元素,并用e返回其值*/

ListLength(L);/*返回线性表L的元素个数*/

我们大致可以将上述函数分为两类,一类参数列表中没有*,例如:ListEmpty(L);

另一类在L或者e前面有个(*)号,究竟是为什么呢?

我们可以从下面这些代码得到启发

#include <stdio.h>
#include <stdlib.h>
void test1(int a,int b)
{
    int c=0;
    c=b;
    b=a;
    a=c;
    printf("%d\n",a);
    printf("%d\n",b);

}
int main()
{
   int a=1;
   int b=2;
   test1(a,b);
    printf("%d\n",a);
    printf("%d\n",b);
}

运行结果如下,可见test1中a,b作为形参互相交换值对main函数中的实参并没有影响

2
1
1
2
 
Process returned 0 (0x0)   execution time : 0.118 s
Press any key to continue.

让我们对上述代码稍作改动来观察结果

#include <stdio.h>
#include <stdlib.h>
void test1(int *a,int *b)
{

    int c=0;
    c=*b;
    *b=*a;
    *a=c;
        printf("%d\n",&a);
    printf("%d\n",&b);

}
int main()
{
   int a=1;
   int b=2;
   test1(&a,&b);
    printf("%d\n",a);
    printf("%d\n",b);
    return 0;
}

6422000
6422008
2
1
 
Process returned 0 (0x0)   execution time : 0.033 s
Press any key to continue.

很显然,此次的test1()方法对main函数的实参总算有了影响,因为现在的test()方法是直接对地址为6422000与6422008存储单元数据域的修改。

我们继续回到对线性表操作上来,就会恍然大悟。例如:ListInsert(*L,i,e),倘若不加*,那么L就永远作为一个局部变量留在了函数:ListInsert(L,i,e)中,没法发生实际的改变。加了*才能保证L被带出来。我们只需要在方法定义时给形参加上'*',在方法调用时给形参加上'&'就能获得预期的效果

思考:另一种解决思路:是不是可以定义一种List Insert()方法,使得返回值为已经修改好的链表L呢?

List Insert(List L,int i,ElememtType e)
{
    /*
    此处为对链表进行插入操作
                            */
    return List;//要注意这个返回的List值已经被修改了
}

不过这也有个弊病,当插入发生在表头时,L就必须要指向新的节点,否则地址仍指向的是原来 的表头结点。解决方法也有,就是在链表第一个节点a前再插一个无意义的头节点b,这样每次想要在表头插入元素时只需插在a,b之间即可。

注:C语言中*a指向a的数据域,&则是读取a的地址。

到此这篇关于C语言*与&在操作线性表的作用详解的文章就介绍到这了,更多相关C语言线性表* &内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言编程数据结构线性表之顺序表和链表原理分析

    目录 线性表的定义和特点 线性结构的特点 线性表 顺序存储 顺序表的元素类型定义 顺序表的增删查改 初始化顺序表 扩容顺序表 尾插法增加元素 头插法 任意位置删除 任意位置添加 线性表的链式存储 数据域与指针域 初始化链表 尾插法增加链表结点 头插法添加链表结点 打印链表 任意位置的删除 双向链表 测试双向链表(主函数) 初始化双向链表 头插法插入元素 尾插法插入元素 尾删法删除结点 头删法删除结点 doubly-Linked list.c文件 doubly-Linkedlist.h 线性表的定

  • C语言代码详细描述顺序线性表

    目录 代码内容包括: 代码实现如下: 总结 代码内容包括: 1.表的创建 2.增删改查插 3.界面跳转 代码实现如下: #include <stdio.h> #include<stdlib.h> #define MaxSize 20 typedef int ElemType;//将int类型赋予别名 //创建结构体 typedef struct{ ElemType A[MaxSize];//MaxSize是给表的一个预估容量 int n;//n是指当前A的元素个数,记录当下表的大小

  • C语言线性表的顺序表示与实现实例详解

    1.概述 通常来说顺序表是在计算机的内存中以数组的形式保存的线性表,是用一组地址连续的存储单元依次存储数据元素的线性数据结构.线性表采用顺序存储的方式存储就称之为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构就是顺序结构. 采用顺序存储结构的线性表简称为" 顺序表".顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤

  • C语言线性表顺序存储结构实例详解

    C语言线性表顺序存储结构实例详解 1. 什么是顺序存储结构? 用一段地址连续的存储单元依次存储线性表的数据元素. 2.线性表的顺序存储结构 #include<stdio.h> #include<stdlib.h> #define Max 80 //存储空间初始分配量 #define Increment 10 //存储空间分配增量 typedef struct { int *elem; // 存储空间基地址,此处为int型,视情况而定 int length; // 元素表当前长度 i

  • C语言*与&在操作线性表的作用详解

    在数据结构线性表一章,对线性表有这些操作方法(Operation): /*Operation*/ Initlist(*L);/*初始化操作,建立一个空的线性表L*/ ListEmpty(L):/*判断线性表是否为空表,若线性表为空,返回值为true,否则返回false*/ ClearList(*L):/*将线性表清空*/ GetElem(L,i,*e):/*性表L中的第i个位置元素值返回给e*/ LocateElem(L,e):/*在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在

  • C语言实现线性表的基本操作详解

    目录 前言 一.实训名称 二.实训目的 三.实训要求 四.实现效果 五.顺序存储代码实现 六.链式存储代码实现 前言 这里使用的工具是DEV C++ 可以借鉴一下 一.实训名称 线性表的基本操作 二.实训目的 1.掌握线性表的基本概念 2.掌握线性表的存储结构(顺序存储与链式存储) 3.掌握线性表的基本操作 三.实训要求 1.线性表可以顺序表也可以用单链表实现,鼓励大家用两种方式实现. 2.创建线性表时,数据从键盘输入整形数据 3.线性表类型定义和或各种操作的实现,可以用教材给出的方法,也可以自

  • Java 数据结构线性表之顺序存储详解原理

    目录 线性表的定义 线性表的基本运算 线性表的存储之顺序存储 定义线性表 添加元素 查找元素 删除元素 打印线性表 实现的完整代码 测试一下 线性表的定义 线性表的逻辑特征: ①有且仅有一个称为开始元素的a1,她没有前趋,仅有一个后继结点a2: ②有且仅有一个称为终端元素的an,他没有后继,只有一个直接前驱a(n-1): ③其余元素ai(2≤i≤n-1)称为内部元素,他们都有且仅有一个直接前驱a(i-1)和直接后继a(i+1). 线性表的图像表示 线性表的基本运算 线性表初始化 求表长 按索引值

  • C语言数据结构线性表教程示例详解

    目录 线性表 顺序表 线性表 数据结构里我们时常看到什么什么表,线性表是最基本.最简单.也是最常用的一种数据结构,其他各种表的万恶之源就是这个线性表,他是个啥其实顾名思义: 一个线性表是n个具有相同特性的数据元素的有限序列.数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部.比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点). 说的这么复杂其实就是

  • C#操作注册表的方法详解

    本文实例讲述了C#操作注册表的方法.分享给大家供大家参考,具体如下: 下面我们就来用.NET下托管语言C#注册表操作,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和删除.判断注册表项是否存在.判断键值是否存在. 准备工作: 1. 要操作注册表,我们必须要引入必要的命名空间: 复制代码 代码如下: using Microsoft.Win32; 在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~ 2. 命名空间里面提供了一个类:RegistryKey 利用它

  • C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解

    目录 一.strlen函数模拟 二. strcpy函数模拟 三.strcat函数模拟 四.strcmp函数模拟 总结 一.strlen函数模拟 字符串以‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包括‘\0’); 有三种方法可以实现该操作: ①计数器方式 ②不能创建临时变量计数器 ③指针-指针 方法一:计数器方式 int my_strlen(const char* str) { int count = 0;//定义count用来记录字符串数组中字符数 w

  • Django外键(ForeignKey)操作以及related_name的作用详解

    之前已经写过一篇关于Django外键的文章,但是当时并没有介绍如何根据外键对数据的操作,也就是如何通过主表查询子表或者通过子表查询主表的信息 首先我定义了两个模型,一个是老师模型,一个是学生模型,一个老师对应多个学生,这个算是一个一对多的类型(如下图所示) 那么如果我们要想查询一个老师对应的学生有哪些,该如何操作呢? 首先我们先查询到老师的信息,在这里我们使用python shell 进行演示  ,输入命令python manage.py shell 进入python shell操作界面: 第一

  • C语言超详细讲解线性表

    目录 1. 顺序表 1.1 管理结点 1.2 顺序表的插入 1.3 顺序表的删除 1.4 顺序表的扩容 2. 链表 2.1 定义 2.2 头部插入 2.3 尾部插入 2.4 任意位置插入 2.5 任意位置删除 2.6 虚头结点 1. 顺序表 顺序表是指用一段连续的地址,依次存放数据元素的线性数据结构.此种存储方式使得顺序表的物理结构与逻辑结构都是连续的. 与数组的区别:函数中的数组被存放在栈段中,而栈段有系统限制的大小(可使用ulimit -s查看系统限制的大小,单位为KB),因此顺序表往往使用

  • Go语言实现顺序存储的线性表实例

    本文实例讲述了Go语言实现顺序存储的线性表的方法.分享给大家供大家参考.具体如下: 代码如下: 复制代码 代码如下: ///////// // 顺序存储线性表 //////// package main import "fmt" const MAXSIZE = 20 //定义数组长度 //定义线性表结构 type List struct {     Element [MAXSIZE]int //存储线性表元素的数组     length  int          //线性表长度 }

  • C语言实现静态顺序表的实例详解

    C语言实现静态顺序表的实例详解 线性表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 接下来看看静态的顺序表,直接上代码: SeqList.h #define _CRT_SECURE_NO_WARNINGS 1 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h> #include <stdlib.h&g

随机推荐