{
typedef int STDataType;
typedef struct Stack{
STDataType* a;//与
int top;
int capacity;
}ST;
//栈实现的接口
void StackInit(ST* ps) //初始化结构体,传结构体的指针
void DestroyStack(ST* ps)
void StackPush(ST* ps,STDataType x)
void StackPop(ST* ps,);
STDataType StackPop(ST* ps);//取栈顶数据
int StackSize(ST* ps);
}
初始化结构体,传结构体的指针,
头删头插也得传结构体的指针
在给定的C语言代码中,ST
是一个结构体类型,表示栈的数据结构。它包含以下成员:
a
:指向存储栈元素的数组的指针。top
:表示栈顶的索引。capacity
:表示栈的容量。这里使用了typedef
关键字来定义STDataType
,它被定义为int
类型,用作栈元素的数据类型。
为了操作这个栈数据结构,代码中定义了一些函数接口,包括:
void StackInit(ST* ps)
:用于初始化栈结构体。它接收一个指向ST
结构体的指针作为参数,以便在函数内部修改结构体的成员。void DestroyStack(ST* ps)
:用于销毁栈结构体,释放内存。void StackPush(ST* ps, STDataType x)
:将元素x
压入栈中。它接收一个指向ST
结构体的指针作为参数,以便在函数内部修改结构体的成员。void StackPop(ST* ps)
:从栈中弹出一个元素。它接收一个指向ST
结构体的指针作为参数,以便在函数内部修改结构体的成员。STDataType StackTop(ST* ps)
:返回栈顶的元素值,但不弹出。它接收一个指向ST
结构体的指针作为参数,以便在函数内部访问结构体的成员。int StackSize(ST* ps)
:返回栈的当前元素个数。它接收一个指向ST
结构体的指针作为参数,以便在函数内部访问结构体的成员。为什么在访问栈顶数据和栈长度时需要传递结构体指针呢?这是因为这些操作需要访问或修改结构体的成员,而C语言中函数的参数是通过值传递的。如果不传递指针,那么函数内部将无法修改原始的结构体对象。通过传递指针,函数可以通过指针来访问结构体的成员,以便对其进行操作。
总之,结构体指针在这里的作用是允许函数修改原始的结构体对象,而不是对副本进行操作。这样可以确保栈结构体在函数调用之间保持一致,并且可以正确地访问和修改其成员。
这里就是我们的重点了,我们创建了一个类型要先去定义变量然后初始化,最后去使用这个变量对吧,这是我们最终的目的。那么结构体变量如何创建呢?
这里其实有两种方式,我们来看一段代码:
struct Stu
{
char name;
char sex;
int age;
float score;
}s4,s5;//这里两种方式其实是等价的,
struct Stu s6;//定义的都是全局的结构体变量
int main()
{
struct Stu s1, s2, s3;//此处就是定义的局部的结构体变量了
return 0;
}
那么接下来就是我们的初始化了,怎么进行初始化呢?
struct Stu
{
char name[20];
char sex[10];
int age;
float score;
}s4 = { "如花","female",20,60.0 };
int main()
{
struct Stu s = { "zhangsan","male",18,95.5};
struct Stu s4 = { "如花","female",20,60.0 };
printf("%s %s %d %.1f\n", s.name, s.sex, s.age, s.score);
return 0;
}
还有一点值得一提的是,结构体里面是可以放结构体的,例如下面代码示例:
struct S
{
int a;
char b;
};
struct Stu
{
char name[20];
struct S;//结构体成员可以是结构体
int age;
};
int main()
{
//初始化也用大括号嵌套
struct Stu p = { "旺财",{28,'c'},18 };
printf("%s %d %c %d\n", p.name, p.a, p.b, p.age);
return 0;
}
看到这里,我想你也应该有点感觉了,结构体就是自己定义的一种类型,其实也不是什么高深的东西对不对。