链式栈,用链表摸拟栈。
stack.h
#include<stdio.h>
#include<stdlib.h>
struct LinkStack
{
int id; //编号
int data; //数值
struct LinkStack *pNext;
};
struct LinkStack *phead; //全局变量
typedef struct LinkStack node, *PNODE;
PNODE push(PNODE phead, int id, int data); //进栈
PNODE pup(PNODE phead); //出栈
void showAll(PNODE phead); //显示所有栈的信息
PNODE clearStack(PNODE phead); //清空栈信息
stack.c
#include"stack.h"
PNODE push(PNODE phead, int id, int data) //进栈
{
PNODE pnew = malloc(sizeof(node));
pnew->data = data;
pnew->id = id;
pnew->pNext = NULL;
if (phead == NULL)
{
phead = pnew;
}
else
{
PNODE ptemp = phead;
while (ptemp->pNext != NULL)
{
ptemp = ptemp->pNext;
}
ptemp->pNext = pnew;
}
return phead;
}
PNODE pup(PNODE phead) //出栈
{
//出栈是从尾部出栈
if (phead == NULL)
{
return phead;
}
else if (phead->pNext == NULL) //只有一个节点时出栈
{
printf("%d %d\n", phead->id, phead->data);
phead = NULL;
}
else
{
PNODE p1 = phead;
while (p1->pNext->pNext != NULL)
{
p1 = p1->pNext; //循环到倒数第二个,这时 p1->pNext->pNext就指向最后一个
}
printf("%d %d\n", p1->pNext->id, p1->pNext->data);
//这时可以删除最后一个 即:p1->pNext->pNext
free(p1->pNext->pNext);
p1->pNext = NULL;
}
return phead;
}
void showAll(PNODE phead) //显示所进栈顺序
{
if (phead == NULL)
{
return;
}
else
{
while (phead != NULL)
{
printf("%d %d\n", phead->id, phead->data);
phead = phead->pNext;
}
}
}
PNODE clearStack(PNODE phead) //清空栈信息
{
PNODE p1 = NULL;
PNODE p2 = NULL;
p1 = phead;
if (phead == NULL)
{
return phead;
}
else
{
while (p1->pNext != NULL)
{
p2 = p1->pNext; //使用 p2 保存 p1 的值,这样就可以删除 p2
p1->pNext = p2->pNext; //让p1->pNext 指向 p2 的下个节点,这样可以把链表连起来
free(p2);
}
//最后删除头节点
free(phead);
phead = NULL;
return phead;
}
}
main.c
#include"stack.h"
void to(int num)
{
printf("num: %d\n ", num);
if (num == 0 )
{
return;
}
else
{// 1: num /2 与 num /= 2 有什么区别?
//to(m /= 2);//这儿是把 m/=2 的值当做参数传递给形参,而且改变了m的值在程序中。
to(num / 2); //这儿是把 m/2 的值当做参数传递给形参。
//如果是先把印,后调用这两种写法都没问题,而如果是先调用,后打印这样打印中使用的 m 值就不同了
//一个是 m ,一个是 m = m/2 (m 除以 2 )后的值,所以先调用后打印有区别。
printf("%3d", num % 2);
}
}
void main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
phead = push(phead, i, 100 + i);
}
showAll(phead);
//printf("\n\n");
//while (phead != NULL)
//{
// phead = pup(phead);
//}
phead = clearStack(phead);
printf("\n\n");
while (phead != NULL)
{
phead = pup(phead);
}
system("pause");
}
void main1()
{
to(10);
system("pause");
}