以栈和队列为例
方法一:
先看代码
typedef int STDataType;
typedef struct Stack {
STDataType* a;
int top;
int capacity;
}ST
void StackInit(ST* ps) {
assert(ps);
ps->a = NULL;
ps->top = 0;//ps->next = -1;
ps->capacity = 0;
}
void test1()
{
ST st;
StackInit(&st);
}
int main()
{
test1();
return 0;
}
在test函数中我们先是定义了一个结构体变量 st ,用函数StackPrint来初始化结构体变量,我们传递进来的是一个结构体变量的地址,通过地址可以来改变结构体变量
第二种方法
#include
#include
#include
typedef int SLDataType;
typedef struct Stack {
SLDataType* a;
int size;
int capacity;
}ST;
Stack* StackInit();
Stack* StackInit()
{
Stack* st = (Stack*)malloc(sizeof(Stack));
st->a = NULL;
st->capacity = st->size = 0;
return st;
}
void test1()
{Stack* st = StackInit();
StackPush(st, 1);
StackPush(st, 2);
StackPush(st, 3);
StackPush(st, 4);
StackPop(st);
StackPrint(st);
}
int main()
{
test1();
return 0;
}
在test1中创建了一个结构体指针,然后我们在StackInit中申请了一个Stack结构体的空间,并给结构体指向的空间进行赋值,然后把这个结构体指针返回给Stack* st
方法三:
#include
#include
#include
typedef int SLDataType;
typedef struct Stack {
SLDataType* a;
int size;
int capacity;
}ST;
void StackInit(Stack** st) {
Stack* s = (Stack*)malloc(sizeof(Stack));
s->a = NULL;
s->capacity = s->size = 0;
*st = s;
}
void test1()
{
Stack* st = (Stack*)malloc(sizeof(Stack));
StackInit(&st);
StackPush(st, 1);
StackPush(st, 2);
StackPush(st, 3);
StackPush(st, 4);
StackPop(st);
StackPrint(st);
}
int main()
{
test1();
return 0;
}
先向内存中申请一个结构体大小的空间,创建一个结构体指针指向这个空间,我们传指针的地址,就可以改变指针的指向,在函数中我们初始化了一个指针指向我们想要的地址,让我们传来的指针的也指向这个地址就行了,这种方法其实本质就是第二种方法
方法四:
#include
#include
#include
typedef int SLDataType;
typedef struct Stack {
SLDataType* a;
int size;
int capacity;
}ST;
void StackInit(Stack** st) {
(*s)->a = NULL;
(*s)->capacity = (*s)->size = 0;
}
void test1()
{
Stack* st = (Stack*)malloc(sizeof(Stack));
StackInit(&st);
StackPush(st, 1);
StackPush(st, 2);
StackPush(st, 3);
StackPush(st, 4);
StackPop(st);
StackPrint(st);
}
int main()
{
test1();
return 0;
}
错误案例
Stack* st = (Stack*)malloc(sizeof(Stack));
StackInit(st);传值的时候传的是一级指针,在上面函数中形参也是一个结构体指针并且只是我们的一个备份,这个备份的改变不会对我们传的实参有任何的影响,我们只有传二级指针才会对我们的实参有影响