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

 更新时间:2021年10月26日 10:33:45   作者:码上就好12884  
本文主要介绍了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语言线性表* &内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解析设计模式中的Prototype原型模式及在C++中的使用

    解析设计模式中的Prototype原型模式及在C++中的使用

    这篇文章主要介绍了设计模式中的Prototype原型模式及在C++中的使用,需要的朋友可以参考下
    2016-03-03
  • C++常用函数总结(algorithm 头文件)

    C++常用函数总结(algorithm 头文件)

    本文给大家详细介绍了algorithm 头文件中最常用的函数及其使用方法,当然这只是其中的一部分,algorithm 头文件中还有很多其他的函数,感兴趣的朋友一起看看吧
    2023-12-12
  • C++详解使用floor&ceil&round实现保留小数点后两位

    C++详解使用floor&ceil&round实现保留小数点后两位

    这篇文章主要介绍了C++使用floor&ceil&round实现保留小数点后两位的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Windows下使用Dev-C++开发基于pthread.h的多线程程序实例

    Windows下使用Dev-C++开发基于pthread.h的多线程程序实例

    下面小编就为大家带来一篇Windows下使用Dev-C++开发基于pthread.h的多线程程序实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • C语言文件操作入门指南

    C语言文件操作入门指南

    我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在,这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式,使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化
    2024-08-08
  • 详解如何利用C++实现一个反射类

    详解如何利用C++实现一个反射类

    这篇文章主要为大家详细介绍了如何利用C++实现一个反射类,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • 深入分析C++中两个大数相乘结果不正确的问题

    深入分析C++中两个大数相乘结果不正确的问题

    本篇文章是对C++中两个大数相乘结果不正确的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 详解C++中的指针、数组指针与函数指针

    详解C++中的指针、数组指针与函数指针

    本文从初学者的角度,深入浅出地讲解C++中的指针、数组指针与函数指针,对最常混淆的引用传递、值传递和指针传递做了区处,需要的朋友可以参考下
    2015-07-07
  • 深入了解C++11中promise和future的使用

    深入了解C++11中promise和future的使用

    C++11中promise和future机制是用于并发编程的一种解决方案,用于在不同线程完成数据传递(异步操作)。Promise和Future提供了访问异步操作结果的机制,可以在线程之间传递数据和异常消息。本文就来聊聊二者的使用,希望对大家有所帮助
    2022-11-11
  • LZ77压缩算法原理的理解

    LZ77压缩算法原理的理解

    这篇文章主要介绍了LZ77压缩算法原理的理解的相关资料,数据压缩是一个减小数据存储空间的过程,目前被应用在软件工程的各个地方,了解其一些原理,方便我们更好的甄选压缩方案,需要的朋友可以参考下
    2017-08-08

最新评论