您的位置:首页 > 编程语言

【链式栈】链式栈的封装<源代码>

2016-05-01 13:23 323 查看
//编译环境 VS3013
/
//头文件 stacklinknode.h
#include<stdio.h>
#include<stdlib.h>

#define  datatype int

struct STACKNODE
{
int num;//编号
datatype data;//数据
struct STACKNODE *pNext;
};
typedef struct STACKNODE stackNode;

stackNode * initStack(stackNode * pHead);
stackNode * push(stackNode * pHead, int num, datatype data);//压栈
stackNode * pop(stackNode * pHead, stackNode * pOutData);//出栈
stackNode * freeAll(stackNode * pHead);
void printfAllMember(stackNode *pHead);

//C文件   stacklinknode.c
//#include<stdio.h>
#include<stdlib.h>
#include "stacklinknode.h"

stackNode * initStack(stackNode * pHead) //初始化
{
return NULL;
}
stackNode * push(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;
//本来没有节点,在头部插入一个节点之后,让pHead指着
}
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;
}
}
stackNode * freeAll(stackNode * pHead)
{
if (pHead == NULL)
{
return NULL;
}
else
{
stackNode *p1 = NULL, *p2 = NULL;
p1 = pHead;
while (p1->pNext != NULL)//有超过一个节点的情况
{
p2 = p1->pNext;
p1->pNext = p2->pNext;
free(p2);
}
free(pHead);  //释放头结点
return NULL;

//对于上边释放代码的改进,上述代码每一次删除第二个节点
//改进之后每次直接删除第一个节点。
/*stackNode * p1 = pHead;
stackNode *p2 = NULL;
if (p1->pNext == NULL)
{
free(pHead);
return NULL;
}
else
{
while (p1->pNext != NULL)
{
p2 = p1;
p1 = p2->pNext;
free(p2);

}
return NULL;
}*/

}
}

//递归实现
void printfAllMember(stackNode *pHead)
{
if (pHead == NULL)
{
return NULL;
}
else
{
printf("%d, %d\n", pHead->num, pHead->data);//打印数据
//printf("%p, %p\n", pHead, pHead->pNext);  //打印地址
printfAllMember(pHead->pNext);
}
}

//测试文件
#include<stdio.h>
#include<stdlib.h>
#include "stacklinknode.h"

void main()
{
stackNode *pHead = NULL;//创建一个链式栈的头结点
pHead = initStack(pHead);

pHead = push(pHead, 1, 1);
pHead = push(pHead, 2, 2);
pHead = push(pHead, 3, 3);
pHead = push(pHead, 4, 4);
pHead = push(pHead, 5, 5);
printf("压栈之后:\n");
printfAllMember(pHead);

pHead = freeAll(pHead);
if (pHead == NULL)
{
printf("释放完成");

printfAllMember(pHead);
}

printf("出栈:\n");
while (NULL != pHead)
{
//保存出栈数据
stackNode *pout = (stackNode *)malloc(sizeof(stackNode));
pHead = pop(pHead, pout);
//printfAllMember(pHead);
printf("%d,%d\n", pout->num, pout->data);

}
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: