| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1356 人关注过本帖
标题:SeqList *L与SeqList L作形参的问题。
只看楼主 加入收藏
jovon
Rank: 1
等 级:新手上路
帖 子:15
专家分:7
注 册:2012-1-25
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:4 
SeqList *L与SeqList L作形参的问题。
int  Locate(SeqList L, ElemType e)
{
 int i=0;        /*i为扫描计数器,初值为0,即从第一个元素开始比较*/
 while ((i<=L.last)&&(L.elem[i]!=e))/*顺序扫描表,直到找到值为key的元素, 或扫描到表尾而没找到*/
  i++;
 if  (i<=L.last)
  return(i+1);  /*若找到值为e的元素,则返回其序号*/
 else
  return(-1);  /*若没找到,则返回空序号*/
}
/*在顺序表L中第i个数据元素之前插入一个元素e。 插入前表长n=L->last+1,
i的合法取值范围是 1≤i≤L->last+2  */
int  InsList(SeqList *L,int i,ElemType e)
{
 int k;
 if((i<1) || (i>L->last+2)) /*首先判断插入位置是否合法*/
 {
  printf("插入位置i值不合法");
  return(ERROR);
 }
 if(L->last>= MAXSIZE-1)
 {
  printf("表已满无法插入");
  return(ERROR);
 }
 for(k=L->last;k>=i-1;k--)   /*为插入元素而移动位置*/
  L->elem[k+1]=L->elem[k];
 L->elem[i-1]=e;   /*在C语言数组中,第i个元素的下标为i-1*/
 L->last++;
 return(OK);
}
首先这两个算法都是正确的,我的问题就是为什么第一个函数的形参是SqList L,第二个函数的形参是SqList *L,这两个具体区别是什么?如果在第一个中使用SqList *L,在第二个中使用SqList L,代码又会是什么样子的?
搜索更多相关主题的帖子: 计数器 return 元素 
2012-02-28 21:01
zhangyin
Rank: 2
等 级:论坛游民
帖 子:22
专家分:43
注 册:2011-10-2
收藏
得分:5 
int  Locate(SeqList L, ElemType e)
{/*
……
*/
}这个函数的功能是找到顺序表中元素e 的位置,不需要改变顺序表中的值。
int  InsList(SeqList *L,int i,ElemType e)
{/*
……
*/
}插入函数的功能是王顺序表中插入元素,需要对顺序表中的结点做改变,只有采用指针的才能真正对表中结点做相应改变。若不采用指针,只能让顺序表在此模块中改变,而不能再内存中真正改变顺序表的结构。
2012-03-03 17:02
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:5 
第一个是传值,不会对原链表有改变,但第二个是传地址,可以改变L的值。
2012-03-05 08:55
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:5 
哦~线性表顺序存储。
///////////////////////////////////////////////////////////////////////////

这个问题说明你对C函数调用传递参数还不是很熟悉。我大概说说,希望对你有帮助。
函数调用传参其实都是值传递。
第一个函数,应该是传递SeqList结构。在执行函数时,会把SeqList复制一遍,
所以对SeqList操作都是在这个“副本”上进行操作,对原先的SeqList不会有影响。但
这个复制的过程,会花费更多的时间。
第二个函数,传递的是指向SeqList的指针,在执行函数时,也会把这个指针复制一遍,
但在函数进行操作的时候,是操作该指针所指向的数据,所以你对该指针指向的数据操作
和直接操作调用前的SeqList是一样的。

OK,应该明白了吧?
2012-03-06 22:21
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
收藏
得分:5 
以下是引用zhoufeng1988在2012-3-6 22:21:00的发言:

哦~线性表顺序存储。
///////////////////////////////////////////////////////////////////////////

这个问题说明你对C函数调用传递参数还不是很熟悉。我大概说说,希望对你有帮助。
函数调用传参其实都是值传递。
第一个函数,应该是传递SeqList结构。在执行函数时,会把SeqList复制一遍,
所以对SeqList操作都是在这个“副本”上进行操作,对原先的SeqList不会有影响。但
这个复制的过程,会花费更多的时间。
第二个函数,传递的是指向SeqList的指针,在执行函数时,也会把这个指针复制一遍,
但在函数进行操作的时候,是操作该指针所指向的数据,所以你对该指针指向的数据操作
和直接操作调用前的SeqList是一样的。

OK,应该明白了吧?
明白了

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-03-07 09:37
快速回复:SeqList *L与SeqList L作形参的问题。
数据加载中...
 
   



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

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