栈的链式储存结构称为链栈。链栈的节点类型与链式线性表的节点类型
定义相同,不同的是它是仅在表头进行操作的单链表。链栈通常用不带头节
点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示:
#include
#include
typedef int ElemType;
typedef struct stack{
ElemType data;
struct stack *next;
}stack,*Linkstack;
/*Function:栈的初始化*/
Linkstack Initstack(Linkstack s){
s=NULL; //栈顶指向NULL
return s;
}
/*Function:压栈*/
Linkstack Push(Linkstack s,ElemType e){
Linkstack p; //新结点
p=(Linkstack)malloc(sizeof(stack));
p->data=e; //新结点赋值
p->next=s;
s=p;
printf("%d入栈\n",s->data);
return s;
}
/*Function:出栈 */
Linkstack Pop(Linkstack s)
{
Linkstack p;
if(s==NULL){
return;
}
printf("%d出栈\n",s->data);
p=s;s=s->next;free(p);
return s;
}
/*Function:获取栈顶元素 */
ElemType getTop(Linkstack s){
if(s!=NULL){
return s->data;
}
}
/*Function:输出栈中所有元素*/
void PrintAll(Linkstack s)
{
if(s==NULL){
printf("栈为空!\n");
return;
}else{
printf("顶端[");
while(s!=NULL){
printf("%d-",s->data);
s=s->next;
}
printf("]底端\n");
}
}
/*主函数*/
void main(){
Linkstack s;
s=Initstack(s);
s=Push(s,3);
s=Push(s,4);
s=Push(s,5);
PrintAll(s);
s=Pop(s);
s=Pop(s);
PrintAll(s);
}
这是因为这里头指针的地址发生了改变,我们在回忆一下c语言做过的数值交换问题,我们必须操作这两个数的
地址才能实现正真的交换。这里同样,如果想要保存头指针的地址值,我们就要使用二维指针,这样函数运行
完后头指针的地址值才能保存。以下程序就是用的二维指针来实现头指针地址的保存。(上面的程序能保存头
指针地址是因为我们返回了头指针地址,c语言中可以对返回值保留一次,所以可以正确执行)
#include
#include
typedef int ElemType;
typedef struct stack {
ElemType data;
struct stack* next;
}stack, * Linkstack;
///*Function:栈的初始化*/
//void Initstack(Linkstack * s) {
// (*s) = NULL; //栈顶指向NULL
//}
/*Function:压栈*/
void Push(Linkstack * s, ElemType e) {
Linkstack p = NULL; //新结点
p = (Linkstack)malloc(sizeof(stack));
p->data = e; //新结点赋值
p->next = *s;
(*s) = p;
printf("%d出栈\n", (*s)->data);
}
/*Function:出栈 */
void Pop(Linkstack * s)
{
Linkstack p;
if ((*s)== NULL) {
return;
}
printf("%d出栈\n", (*s)->data);
p = *s; *s = (*s)->next; free(p);
}
/*Function:获取栈顶元素 */
ElemType getTop(Linkstack s) {
if (s != NULL) {
return s->data;
}
}
/*Function:输出栈中所有元素*/
void PrintAll(Linkstack s)
{
if (s == NULL) {
printf("栈为空!\n");
return;
}
else {
printf("顶端[");
while (s != NULL) {
printf("%d-", s->data);
s = s->next;
}
printf("]底端\n");
}
}
/*主函数*/
void main() {
Linkstack * s=NULL;
Push(&s, 3);
Push(&s, 4);
Push(&s, 5);
PrintAll(s);
Pop(&s);
Pop(&s);
PrintAll(s);
}