栈的链式存储

来源:互联网 发布:制作假营业执照软件 编辑:程序博客网 时间:2024/05/24 23:14

下面是栈的链式存储:


下面是头文件:

#ifndef __LINKSTACK_H__#define __LINKSTACK_H__#include "stdio.h"#include "stdlib.h"#include "nodelist.h"#include "string.h"typedef void LinkStack;typedef void LinkStackNode;LinkStack * LinkStack_Create();void LinkStack_Destroy(LinkStack * stack);void LinkStack_Clear(LinkStack * stack);int LinkStack_Length(LinkStack * stacck);int LinkStack_Push(LinkStack * stack, LinkStackNode * node);LinkStack * LinkStack_Pop(LinkStack *stack);LinkStack * LinkStack_Top(LinkStack * stack);#endif

#ifndef __NODELIST_H__#define __NODELIST_H__#include "stdio.h"#include "stdlib.h"typedef void NodeList;typedef struct _tag_NodeListNode  //单个节点{struct _tag_NodeListNode * next;}NodeListNode;NodeList * NodeList_Create();//链表创建void NodeList_Destroy(NodeList * list); //销毁链表void NodeList_Clear(NodeList * list);//清空链表int NodeList_Length(NodeList *list);//获取链表长度int NodeList_insert(NodeList *list, NodeListNode *node, int pos);//插入节点NodeList *NodeList_Get(NodeList *list, int pos);//获取链表中的元素NodeList *NodeList_Delete(NodeList *list, int pos);//删除节点#endif

下面是上述函数的实现:


#include "nodelist.h"  typedef struct TNodeList{NodeListNode header;   //和老师类一样,一定要放在第一位,偏移量的问题,  header的地址就是链表最前面那个头的地址int length;//链表的长度};NodeList * NodeList_Create()//链表创建{TNodeList *list = NULL;list = (TNodeList *)malloc(sizeof(TNodeList));if (list == NULL){printf("ERROR!! FUNC NodeList_Create()  申请内存失败\n");return NULL;}list->length = 0;list->header.next = NULL;//初始化return list;}void NodeList_Destroy(NodeList * list) //销毁链表{TNodeList *tlist = NULL;tlist = (TNodeList *)list;if (tlist != NULL){free(list);}return;}void NodeList_Clear(NodeList * list)//清空链表{TNodeList *tlist = NULL;tlist = (TNodeList *)list;if (tlist == NULL){return;}tlist->length = 0;tlist->header.next = NULL;return;}int NodeList_Length(NodeList *list)//获取链表长度{TNodeList *tlist = NULL;tlist = (TNodeList *)list;if (tlist == NULL){return -1;}return tlist->length;}int NodeList_insert(NodeList *list, NodeListNode *node, int pos)//插入节点{int ret = 0;if (list == NULL || node == NULL || pos < 0){ret = -3;return ret;}TNodeList *tlist = NULL;tlist = (TNodeList *)list;if (tlist == NULL){ret = -1;return ret;}NodeListNode *current = NULL;current = (NodeListNode *)list;if (current == NULL){ret = -2;return ret;}if (pos > NodeList_Length(list)){ret = -4;return ret;}for (int i = 0; i < pos ; i++){current = current->next;}node->next = current->next;current->next = node;tlist->length++;return ret;}NodeList *NodeList_Get(NodeList *list, int pos)//获取链表中的元素{if (list == NULL || pos < 0){return NULL;}TNodeList *tlist = NULL;tlist = (TNodeList *)list;if (tlist == NULL){return NULL;}if (pos >= NodeList_Length(list)){return NULL;}NodeListNode *current = NULL;current = (NodeListNode *)list;if (current == NULL){return NULL;}for (int i = 0; i < pos; i++){current = current->next;}return (NodeList *)(current->next);}NodeList *NodeList_Delete(NodeList *list, int pos)//删除节点{if (list == NULL || pos < 0){return NULL;}TNodeList *tlist = NULL;tlist = (TNodeList *)list;if (tlist == NULL){return NULL;}if (pos >= NodeList_Length(list)){return NULL;}NodeListNode *current = NULL;current = (NodeListNode *)list;if (current == NULL){return NULL;}for (int i = 0; i < pos; i++){current = current->next;}NodeListNode *last = NULL;last = current->next;current->next = last->next;tlist->length--;return (NodeList *)last;}

#include "LinkStack.h"typedef struct TLinkStackNode{NodeListNode   node;LinkStackNode * tnode;}TLinkStackNode;LinkStack * LinkStack_Create(){return (LinkStack *)NodeList_Create();}void LinkStack_Destroy(LinkStack * stack){if (stack == NULL){return;}LinkStack_Clear(stack);NodeList_Destroy((NodeList *)stack);}void LinkStack_Clear(LinkStack * stack){if (stack == NULL){return;}while (LinkStack_Length(stack) > 0){LinkStack_Pop(stack);}return;}int LinkStack_Length(LinkStack * stack){return NodeList_Length((NodeList *)stack);}int LinkStack_Push(LinkStack * stack, LinkStackNode * node){TLinkStackNode * tmp = NULL;int ret = 0;tmp = (TLinkStackNode *)malloc(sizeof(TLinkStackNode));if (tmp == NULL){return -1;}memset(tmp, 0, sizeof(tmp));tmp->tnode = node;ret = NodeList_insert((NodeList *)stack, (NodeListNode *)tmp, 0);if (ret != 0){free(tmp);return -2;}return 0;}LinkStack * LinkStack_Pop(LinkStack *stack){TLinkStackNode * tmp = NULL;tmp = (TLinkStackNode *)NodeList_Delete((NodeList *)stack, 0);if (tmp == NULL){return NULL;}LinkStackNode *tnode = NULL;tnode = tmp->tnode;free(tmp);return (LinkStack *)tnode;}LinkStack * LinkStack_Top(LinkStack * stack){TLinkStackNode * tmp = NULL;tmp = (TLinkStackNode *)NodeList_Get((NodeList *)stack, 0);if (tmp == NULL){return NULL;}LinkStackNode *tnode = NULL;tnode = tmp->tnode;return (LinkStack *)tnode;}

下面是测试文件:

#include "LinkStack.h"typedef struct Teacher{//LinkStackNode  * node;int age;};void main(){Teacher t1, t2, t3, t4;t1.age = 11;t2.age = 22;t3.age = 33;t4.age = 44;LinkStack *stack = NULL;stack = LinkStack_Create();if (stack == NULL){goto END;}int length = LinkStack_Length(stack);printf("未插入时的长度为:%d\n", length);int ret = 0;ret = LinkStack_Push(stack, (LinkStackNode *)(&t4));if (ret != 0){goto END;}ret = LinkStack_Push(stack, (LinkStackNode *)(&t3));if (ret != 0){goto END;}ret = LinkStack_Push(stack, (LinkStackNode *)(&t2));if (ret != 0){goto END;}ret = LinkStack_Push(stack, (LinkStackNode *)(&t1));if (ret != 0){goto END;}length = LinkStack_Length(stack);printf("插入后的长度:%d\n", length);Teacher * tmp = NULL;tmp = (Teacher *)LinkStack_Top(stack);if (tmp == NULL){goto END;}printf("栈顶元素%d\n", tmp->age);while (LinkStack_Length(stack) > 0){tmp = (Teacher *)LinkStack_Pop(stack);if (tmp == NULL){goto END;}printf("出栈元素 %d\n", tmp->age);}LinkStack_Clear(stack);LinkStack_Destroy(stack);END:system("pause");}


0 0
原创粉丝点击