链式栈的实现
来源:互联网 发布:港融大数据平台不好使 编辑:程序博客网 时间: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");
}
- 栈的链式实现
- 链式栈的实现
- 栈的链式实现
- 链式栈的实现
- 链式栈的实现
- 链式栈的实现
- 链式栈的实现
- 链式栈的实现
- 栈的链式实现
- 栈的实现(链式)
- 链式栈的实现
- 链式栈的实现
- 链式栈的实现
- 链式栈的实现
- 栈的链式实现
- 栈的实现:链式栈
- 栈---链式栈的实现
- 栈的链式实现形式
- 提高Interface Builder高效工作的8个技巧
- iOS UICollectionView
- curl和wget的区别和用法介绍
- Linux 常用命令之top
- LeetCode Longest Consecutive Sequence
- 链式栈的实现
- 黑马程序员——Objective-c——Foundation的NSValue和NSDate
- sql查询语句
- jquer +ajax 跨域訪問 方法
- mysql
- 获取电池电量
- C++primer(六) 数组和指针
- 总结Cocos2d-x 3.x版本的一些变化
- 怎样利用putty登陆SSH主机方法