首页> C语言教程

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

withpy 2021-10-29

简介本文主要介绍了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语言线性表* &内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关文章

  • SpringBoot整合JDBC的实现

    这篇文章主要介绍了SpringBoot整合JDBC的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  • python操作redis数据库的三种方法

    这篇文章主要介绍了python操作redis数据库的三种方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下

  • JS PHP字符串截取函数实现原理解析

    这篇文章主要介绍了JS PHP字符串截取函数实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  • JavaScript代理模式原理与用法实例详解

    这篇文章主要介绍了JavaScript代理模式原理与用法,结合实例形式详细分析了JavaScript代理模式基本概念、原理、用法与操作注意事项,需要的朋友可以参考下

  • 深入浅出理解JavaScript闭包的功能与用法

    这篇文章主要介绍了深入浅出理解JavaScript闭包的功能与用法,结合实例形式从变量、函数的内部属性与作用域链分析了javascript闭包的相关概念、功能与使用技巧,需要的朋友可以参考下

  • spring mvc使用@InitBinder标签对表单数据绑定的方法

    这篇文章主要介绍了spring mvc使用@InitBinder标签对表单数据绑定的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧