链式栈的实现

来源:互联网 发布:港融大数据平台不好使 编辑:程序博客网 时间:2024/04/29 20:10
/************************************************
*文件名:stacklinknode.h
*创建者:ycj
*创建时间:2015-3-16
*文件说明:链式栈头文件说明

*************************************************/

#define datatype int


struct stacknode
{
int num;//编号
datatype data;//数据
struct stacknode *pNext;//指针域
};
typedef struct stacknode StackNode;//简化


StackNode * init(StackNode * phead);//初始化
StackNode * puch(StackNode * phead, int num, datatype data);//压栈
StackNode * pop(StackNode * phead, StackNode * poutdata);//出栈
void printfall(StackNode *phead);//打印链表
StackNode * freeall(StackNode * phead);//清空



/************************************************
*文件名:stacklinknode.c
*创建者:ycj
*创建时间:2015-3-16
*文件说明:链式栈中的函数

*************************************************/

#include <stdio.h>
#include <stdlib.h>
#include "stacklinknode.h"




StackNode * init(StackNode * phead)//初始化
{
return NULL;
}


StackNode * puch(StackNode * phead, int num, datatype data)//压栈
{
StackNode *pnewnode = (StackNode *)malloc(sizeof(StackNode));
pnewnode->num = num;
pnewnode->data = data;
pnewnode->pNext = NULL;//开辟结点并赋值


if (phead == NULL)//空链表,直接连接上
{
phead = pnewnode;//连接一个结点
}
else
{
StackNode *p = phead;
while (p->pNext != NULL)
{
p = p->pNext;//一直向前,直到最后一个结点
}
p->pNext = pnewnode;//添加一个新结点
}


return phead;
}








StackNode * pop(StackNode * phead, StackNode * poutdata)//出栈
{
if (phead == NULL)
{
return NULL;//已经没有元素
}
else if (phead->pNext == NULL)//只有一个结点
{
poutdata->num = phead->num;
poutdata->data = phead->data;//取出数据
free(phead);//释放内存
phead = NULL;


return phead;
}
else
{
StackNode *p = phead;


while (p->pNext->pNext != NULL)
{
p = p->pNext;//获取倒数第二个结点
}
poutdata->num = p->pNext->num;
poutdata->data = p->pNext->data;//取出数据
free(p->pNext);//释放内存
p->pNext = NULL;


return phead;
}



}


void printfall(StackNode *phead)//打印链表
{
if (phead == NULL)
{
return;
}
else
{
printf("%d,%d,%p,%p\n", phead->num, phead->data, phead, phead->pNext);
return printfall(phead->pNext);
}
}


//删除所有结点
StackNode * freeall(StackNode * phead)
{
if (phead == NULL)
{
return NULL;
}
else
{
StackNode *p1, *p2;
p1 = phead;//头结点


while (p1->pNext != NULL)
{
p2 = p1->pNext;//保存头结点的下一个结点
p1->pNext = p2->pNext;//跳过p2
free(p2);//释放p2结点
}
free(phead);


return NULL;
}
}




/************************************************
*文件名:test,c
*创建者:ycj
*创建时间:2015-3-16
*文件说明:链式栈模块的测试:用来实现进制的转化

*************************************************/

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "stacklinknode.h"


void main1()
{
StackNode *phead = NULL;//创建一个链式栈的头结点


phead = init(phead);//设置栈为空
phead = puch(phead, 1, 5);//压栈
phead = puch(phead, 2, 20);//压栈
phead = puch(phead, 3, 13);//压栈
phead = puch(phead, 4, 14);//压栈


printf("进栈之后\n");
printfall(phead);//打印链表


//{
// //保存出栈的数据
// StackNode *pout = (StackNode *)malloc(sizeof(StackNode));
// phead = pop(phead, pout);//出栈
// printf("出栈之后\n");
// printfall(phead);
// printf("出栈之后的数据\n");
// printf("%d,%d\n", pout->num, pout->data);
//}


while (phead != NULL)
{
//保存出栈的数据
StackNode *pout = (StackNode *)malloc(sizeof(StackNode));
phead = pop(phead, pout);//出栈
printf("出栈之后\n");
printfall(phead);
printf("出栈之后的数据\n");
printf("%d,%d\n", pout->num, pout->data);
}


system("pause");
}


void main()
{
int num = 0;
scanf("%d", &num);
StackNode *phead = NULL;//创建一个链式栈的头结点
phead = init(phead);//设置栈为空


while (num != 0)
{
phead = puch(phead, num % 2, 0);
num /= 2;
}


while (phead != NULL)
{
StackNode *pout = (StackNode *)malloc(sizeof(StackNode));
phead = pop(phead, pout);
printf("%d", pout->num);
}


system("pause");
}




0 0