目录
思考:(1)为什么void InitStack(LinkStNode *&s)要加*?
(2)为什么void InitStack(LinkStNode *&s)要加&?
#include <bits/stdc++.h>
typedef struct linknode{
int data;
struct linknode *next;
}LinkStNode;//进行二次定义
void InitStack(LinkStNode *&s);
bool StackEmpty (LinkStNode *s);
void push(LinkStNode * &s,int e);
bool Pop(LinkStNode *&s,int &e);
main(){
LinkStNode *s;
int e;
InitStack(s);
push(s,1);
push(s,3);
push(s,5);
while(!StackEmpty(s)){
Pop(s,e);
printf("%4d",e);
}
}
void InitStack(LinkStNode *&s){
/* 对s有返回值,对s的改变能直接改变s,
返回s,所以是&s
*/
//创建一个栈
s=(LinkStNode *)malloc(sizeof(LinkStNode));
//新建一个节点
s->next = NULL;
}
bool StackEmpty (LinkStNode *s){
//判断栈是否为空
bool flag;
if(s->next == NULL){
flag=true;
}else{
flag=false;
}
return flag;
}
void push(LinkStNode * &s,int e){
//把e插入到栈s中,作为栈顶元素
LinkStNode *p;
//新建一个结点p;用来存放e
p=(LinkStNode *)malloc(sizeof(LinkStNode));
p->data=e;
//把p插入到头结点之后
p->next=s->next;
s->next=p;
}
bool Pop(LinkStNode *&s,int &e){
//栈不为空时,取首结点的data赋值给e,
//然后将其删除
LinkStNode *p;
bool flag;
flag=true;
p=s->next;
if(!StackEmpty(s)) {
s->next=p->next;
e=p->data;
}else{
flag=false;
}
return flag;
}
思考:(1)为什么void InitStack(LinkStNode *&s)要加*?
通过添加*
符号,我们明确指定了参数s
的类型为指针类型,并将其作为指针引用传递给函数,以便在函数内部修改指针所指向的对象。
在函数声明InitStack(LinkStNode *&s)
中,*
符号用于指定参数s
的类型为指针类型。这意味着s
将被用作指向LinkStNode
类型对象的指针。
在函数定义中,参数s
的类型被指定为LinkStNode *&
,表示这是一个指向指针的引用。通过使用*
符号,我们表明参数s
是一个指向指针的引用,而不是一个普通的指针或变量。
为什么要使用指针引用作为参数类型呢?这是因为我们希望在函数内部修改指针s
所指向的对象,而不仅仅是修改指针本身。通过使用指针引用作为参数类型,函数可以修改原始指针变量,而这些更改将在函数外部可见。
具体到InitStack
函数,我们希望在函数内部分配内存并更新指针s
,使其指向新创建的栈对象。通过使用指针引用作为参数类型,函数可以修改原始指针s
,并使其指向新分配的内存空间。如果不使用指针引用,函数将仅修改参数s
的副本,而不会对原始指针产生任何影响。
(2)为什么void InitStack(LinkStNode *&s)要加&?
改变s。
在函数声明InitStack(LinkStNode *&s)
中,&
符号用于指定参数s
的传递方式为引用传递。它表示将参数s
作为引用传递给函数,而不是通过值传递或指针传递。
引用传递允许函数直接操作原始变量,并将对变量的修改反映到函数外部。通过引用传递,函数可以获得对原始变量的访问权限,而不是操作变量的副本。
在InitStack
函数中,我们希望在函数内部分配内存并更新指针s
,使其指向新创建的栈对象。通过使用引用传递,我们可以直接修改原始指针变量s
的值,而这些修改将在函数外部可见。如果不使用引用传递,函数将获得指针s
的副本,对副本进行的任何修改都不会影响原始指针。
因此,通过添加&
符号,我们指定了参数s
的传递方式为引用传递,这样函数可以直接修改原始指针s
,并将这些修改反映到函数外部。这样做可以确保在函数执行完毕后,原始指针s
将指向新分配的内存空间。