c语言传递了非指针,关于传递指针的指针的有关问题

关于传递指针的指针的问题

在大话数据结构这本书关于建立单链表的代码中,创建单链表的的代码是通过传递头指针的指针来实现的,我觉得好像没有必要,初始化的时候传递头指针的指针我能理解,其他地方我觉得只要传递头指针就可以了,以下是代码,大家看看我说的是不是正确。

#include 

#include 

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

typedef int Status;

typedef int ElemType;

static Status visit(ElemType c)

{

printf("%d ",c);

return OK;

}

typedef struct Node

{

ElemType data;

struct Node *next;

}Node,*LinkList;

/* 初始化顺序线性表 */

static Status InitList(LinkList *L)

{

*L=(LinkList) malloc(sizeof(Node));

if(!(*L))

return ERROR;

(*L)->next=NULL;

return OK;

}

/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */

static int ListLength(LinkList L)

{

int i=0;

LinkList p;

p=L->next;

while(p)

{

i++;

p=p->next;

}

return i;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */

/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */

static Status ListInsert(LinkList *L,int i,ElemType e)/*???这里的LinkList *L,我能不能改成LinkList L???*/

{

int j;

LinkList p,s;

p=*L;/*???这里改成p=L???*/

j=1;

while(p && j

{

p=p->next;

j++;

}

if(!p || j>i)

return ERROR;

s=(LinkList)malloc(sizeof(Node));

s->data=e;

s->next=p->next;

p->next=s;

return OK;

}

/* 初始条件:顺序线性表L已存在 */

/* 操作结果:依次对L的每个数据元素输出 */

static Status ListTraverse(LinkList L)

{

LinkList p=L->next;

while(p)

{

visit(p->data);

p=p->next;

}

printf("\n");

return OK;

}

main()

{

Status i;

ElemType e;

LinkList L;

int j,k;

i=InitList(&L);

printf("初始化L后:ListLength(L)=%d\n",ListLength(L));

for(j=1;j<=5;j++)

{

i=ListInsert(&L,1,j);

}

printf("在L的表头依次插入1~5后:L.data=");

ListTraverse(L);

return 0;

}

①static Status ListInsert(LinkList *L,int i,ElemType e)/*???这里的LinkList *L,我能不能改成LinkList L???*/

-------------》

static Status ListInsert(LinkList L,int i,ElemType e)/*???这里的LinkList *L,我能不能改成LinkList L???*/

然后里面的p=*L;改成p=L;

如果将函数改成以上的形式可以吗?

②另外,在函数ListInsert中,这里的if(!p ||  j >i)判断条件的 j >i是不是多余的?会有这种情况发生吗?

------解决思路----------------------

参考代码

12475993.gif

http://yun.baidu.com/s/17yIcQ

------解决思路----------------------

可以的,你的首结点其实没数据,写代码时小心点就行了

------解决思路----------------------

个人感觉可以,你可以自己实现以下你的想法

------解决思路----------------------

如果要用上首结点的话,就需要传头指针的指针了,可能作者的想法跟代码在逻辑上不一致了

------解决思路----------------------

C:

需要更换头结点,

形参采用指针的指针,

实参采用头结点的地址。

C++:

可以用C的方法

也可以传递指针的引用,

形参是指针的引用

实参就是头结点的名字

(实质是传递引用)

很多C++编译器,引用使用指针实现

所以引用传递,和指针值传递生成的代码相同或者相近

(  C++无空引用,所以 引用比指针传递更好

也更容易优化代码

如果不加优化代码,

这些编译器中,引用传递,和指针值传递,生成的代码相同                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         )

------解决思路----------------------

就你这个插入算法看,

这里确实不需要更新头结点,因为

你这是个带空头结点的单链表,所有数据节点都在头结点后面。

那么 static Status ListInsert(LinkList *L,int i,ElemType e) 可以改为

static Status ListInsert(LinkList L,int i,ElemType e)

------解决思路----------------------

我的理解是应该就是楼主这样做的没有问题

------解决思路----------------------

当然是可以的,但通常情况下,我们一般在此调用函数之前,是采用动态分配内存的方法,是使用结构体指针,因此在函数形参上,采用结构体指针,这样便于节省内存

------解决思路----------------------

这是带表头结点的单链表,头结点数据域没有值。

这个是可以的,我在vs2010也试过了,

static Status ListInsert(LinkList L,int i,ElemType e)

p=L;    /*???这里改成p=L???*/

调用的时候:

ListInsert(L,1,j);

另外main函数前要加上返回值类型。

------解决思路----------------------

本身这段程序因为建立了空的头节点,只要在插入的时候传入头指针就可以了。

之所以要传入头指针的指针的原因是,头指针L代表这个单链表,而线性表的定义是有两种结构了:

①顺序存储结构

②链式存储结构

线性表的ADT插入算法中,函数原型为:ListInsert(*L,i,e)

为了这两种存储结构的统一,都需要传入线性表的地址,这样同一个ADT就可以同时适用于这两种存储结构

了。

------解决思路----------------------

如果只是传递指针 的话,那就不能让你传进函数的指针指向后来分配 的节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值