标题:数据结构关于销毁线性表的问题
只看楼主
嫌疑人XPL
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-10-4
结帖率:0
已结贴  问题点数:20 回复次数:5 
数据结构关于销毁线性表的问题
刚刚看了一个帖子介绍 *&L 和 *L有什么区别,
他是这么写的

L是个指针,在线性表初始化这个操作中,要对L进行修改赋值,
形参如果是 SqList*L   L在调用前调用后都不会改变,因为是把L拷贝一份
给了函数,是传“值”, 在函数内对L进行的任何修改,都不会影响到L的“本体”
,所以为了达到目的,需要用到 &。
形参是 SqList * &L ,这是引用调用,他传递给函数的,就不是拷贝一份L给函数了,而是将L的地址传给了函数,在函数内对L的任何操作,都是对真正的唯一的L在操作。

其他操作,比如查询,搜索,等等,因为不牵扯到对L的修改,所以可以直接用SqList*L 。


我就看了线性表的各种基本运算的算法,发现我数据结构教材书上写的是 *&L
程序代码:

 void DestroyList(SqList *&L)//销毁线性表 
 {
     free(L);

 }

而数据结构上机指导上写的是*L
程序代码:

 void DestroyList(SqList *L)//销毁线性表 
 {
     free(L);

 }

有没有人帮忙解释一下,我还是不太懂这两个有什么区别?还有这两种写法到底哪一个是对的
搜索更多相关主题的帖子: 影响 线性表 
2016-10-04 10:27
Panda2016
Rank: 2
等 级:论坛游民
威 望:2
帖 子:10
专家分:33
注 册:2016-6-26
得分:5 
效果一样啊
2016-10-04 10:53
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:5 
这两个写法都没错。
区别在实参那。
2016-10-04 13:15
嫌疑人XPL
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-10-4
得分:0 
回复 3楼 linlulu001
我现在还是不怎么明白
2016-10-04 16:22
cpxuvs
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:45
专家分:142
注 册:2015-12-22
得分:5 
*&L是指针的引用,实参是个指针。所以L是实参指针的别名,对别名L的修改,等于对实参的修改。
*L是传值,你无法改变传过来的实参指针变量的值
程序代码:
#include<iostream>
using namespace std;
void foo(int*p);
int main()
{
    int a=5;
    int *b=&a;
    printf("%d %d\n",b,*b);
    foo(b);
    printf("%d %d",b,*b);
}
void foo(int* p)
{
    *p=*p+1;
    p=p+1;

}

输出为

可以看成指针b没变,指针b保存的值变了
程序代码:
#include<iostream>
using namespace std;
void foo(int*&p);
int main()
{
    int a=5;
    int *b=&a;
    printf("%d %d\n",b,*b);
    foo(b);
    printf("%d %d",b,*b);
}
void foo(int*& p)
{
    *p=*p+1;
    p=p+1;

}


指针b和指针b保存的值都变了
下面是复制的。
这种技术很多用在比如定义一个安全删除指针的函数,所谓安全就是,只有当指针为零的时候才执行删除,删除之后,立刻把指针赋值为NULL。
template<typename T>
inline safe_delete(T*& ptr)
{
    if (ptr)
    {
        delete ptr;
        ptr = NULL;
    }
}
我用qt和vs中都发现定义的指针都是这种安全指针。
指针不为零,不让删。删了,如果再NULL也不行。
2016-10-04 18:17
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:5 
学习过cpxuvs的回答,我有以下几点认识:第一,两段代码都可以实现销毁线性表的工作,但是,使用指针引用的方法比一般指针安全。因为我们可以在free之后,在函数内部主动把L重新赋值为NULL(因为它是引用进来的,所以在函数内部对L的一切操作都可以看做是对原变量的操作)。
而题主所说的上级指导的那部分代码所使用的一般指针方法,不能做到这一点。因为函数内外的L不是一个L,他们只是保存了指向了同一个内存地址的指针,二者之间并没有直接联系(当然,你也可以在函数外部把L的地址传递进函数,那样倒是可以透过指针对L进行操作,但那是另一回事。写出来的代码并不是很“寻常”,free(L),free(&L),显然前者才是比较一般常见的)。
另外,引用是C++的语法。而引用和指针都能在函数内部实现对函数外变量的操作,为什么C++专门要发明这样一个引用。听说只是为了省掉几个**和&,让代码整洁一些
程序代码:
#include <stdio.h>
#include<stdlib.h>
#include <math.h>
void DestroyList1(int *&L) { //销毁线性表
    printf("inside:%p-%p\n",&L,L);
    free(L);
    L=NULL;
}

void DestroyList2(int *L) { //销毁线性表
    printf("inside:%p-%p\n",&L,L);
    free(L);
    L=NULL;
}
int main() {
    printf("指针引用\n");
    int *e=(int*)malloc(sizeof(int));
    printf("before:%p-%p\n",&e,e);
    DestroyList1(e);
    printf("after:%p-%p\n",&e,e);


    printf("一般指针\n");
    int *p=(int*)malloc(sizeof(int));
    printf("before:%p-%p\n",&p,p);
    DestroyList2(p);
    printf("after:%p-%p\n",&p,p);


    return 0;
}




φ(゜▽゜*)♪
2016-10-05 10:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-469417-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.100181 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved