#ifndef _MY_LINKSTACK_H_
#define _MY_LINKSTACK_H_
typedef void LinkStack;
LinkStack* LinkStack_Create();
void LinkStack_Destroy(LinkStack* stack);
void LinkStack_Clear(LinkStack* stack);
int LinkStack_Push(LinkStack* stack, void* item);
void* LinkStack_Pop(LinkStack* stack);
void* LinkStack_Top(LinkStack* stack);
int LinkStack_Size(LinkStack* stack);
#endif //_MY_LINKSTACK_H_
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "linkstack.h"
#include "linklist.h"
typedef struct _tag_LinkStack
{
LinkListNode node;
void* item;
}TLinkStack;
//创建一个栈 相当于 创建一个线性表
LinkStack* LinkStack_Create()
{
return LinkList_Create();
}
void LinkStack_Destroy(LinkStack* stack)
{
LinkStack_Clear(stack); //释放栈的 结点
LinkList_Destroy(stack); //释放句柄
}
void LinkStack_Clear(LinkStack* stack)
{
while (LinkList_Length(stack) > 0)
{
LinkStack_Pop(stack);
}
return ;
}
//向栈中添加元素 相等向 线性表中 添加结点
int LinkStack_Push(LinkStack* stack, void* item)
{
int ret = 0;
TLinkStack *tmp = NULL;
//// void* item 栈结点 ===>链表结点
tmp = (TLinkStack *)malloc(sizeof(TLinkStack));
tmp->item = item;
ret = LinkList_Insert(stack, (LinkListNode *)tmp, 0);
if (ret != 0)
{
printf("func LinkList_Insert() err:%d \n", ret);
free(tmp);
return ret;
}
return ret;
}
//从栈中 弹出 元素 相当于 从线性表中 删除0号位置元素
void* LinkStack_Pop(LinkStack* stack)
{
TLinkStack *tmp = NULL;
void *item = NULL;
tmp = (TLinkStack*) LinkList_Delete(stack, 0);
if (tmp == NULL)
{
printf("func LinkList_Delete() err \n");
return NULL;
}
//把链表节点 ====>转换成 栈结点
item = tmp->item;
free(tmp);
return item;
}
//获取栈顶元素 相等于 从线性表的0号位置元素
void* LinkStack_Top(LinkStack* stack)
{
TLinkStack *tmp = NULL;
void *item = NULL;
tmp = (TLinkStack *)LinkList_Get(stack, 0);
if (tmp == NULL)
{
printf("func LinkStack_Top() err \n");
}
item = tmp->item;
return item;
}
int LinkStack_Size(LinkStack* stack)
{
return LinkList_Length(stack);
}
#ifndef _MYLINKLIST_H_
#define _MYLINKLIST_H_
typedef void LinkList;
/*
typedef struct _tag_LinkListNode LinkListNode;
struct _tag_LinkListNode
{
LinkListNode* next;
};
*/
typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode* next;
}LinkListNode;
LinkList* LinkList_Create();
void LinkList_Destroy(LinkList* list);
void LinkList_Clear(LinkList* list);
int LinkList_Length(LinkList* list);
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
LinkListNode* LinkList_Get(LinkList* list, int pos);
LinkListNode* LinkList_Delete(LinkList* list, int pos);
#endif
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "linklist.h"
typedef struct _tag_LinkList
{
LinkListNode header;
int length;
}TLinkList;
//
LinkList* LinkList_Create() //O(1)
{
TLinkList *tmp = NULL;
tmp = (TLinkList *)malloc(sizeof(TLinkList));
if (tmp == NULL)
{
printf("func LinkList_Create() err \n");
return NULL;
}
memset(tmp, 0, sizeof(TLinkList));
tmp->length = 0;
tmp->header.next = NULL; //
return tmp;
}
void LinkList_Destroy(LinkList* list) //O(1)
{
if (list == NULL)
{
return ;
}
free(list);
return ;
}
void LinkList_Clear(LinkList* list) //O(1)
{
TLinkList *tList = NULL;
tList = (TLinkList *)list;
if (tList == NULL)
{
return ;
}
tList->header.next = NULL;
tList->length = 0;
return ;
}
int LinkList_Length(LinkList* list) //O(1)
{
TLinkList *tList = NULL;
tList = (TLinkList *)list;
if (tList == NULL)
{
return -1;
}
return tList->length;
}
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) //O(n)
{
int i = 0;
LinkListNode *current = NULL;
TLinkList *tList = NULL;
tList = (TLinkList *)list;
if (list==NULL || node==NULL || pos<0)
{
return -1;
}
current = &(tList->header);
for (i=0; i<pos; i++)
{
current = current->next;
}
//新结点 连接 后继链表
node->next = current->next;
//前面的链表 连接 新结点
current->next = node;
tList->length ++;
return 0;
}
LinkListNode* LinkList_Get(LinkList* list, int pos) //O(n)
{
int i = 0;
LinkListNode *current = NULL;
TLinkList *tList = NULL;
tList = (TLinkList *)list;
if (list==NULL || pos<0)
{
return NULL;
}
current = &(tList->header); //赋值指针变量初始化
for (i=0; i<pos; i++)
{
current = current->next;
}
return current->next;
}
LinkListNode* LinkList_Delete(LinkList* list, int pos) //O(n)
{
int i = 0;
LinkListNode *current = NULL;
LinkListNode *ret = NULL;
TLinkList *tList = NULL;
tList = (TLinkList *)list;
if (list==NULL || pos<0)
{
return NULL;
}
current = &(tList->header);
for (i=0; i<pos; i++)
{
current = current->next;
}
ret = current->next; //缓存要删除的结点
current->next = ret->next;
tList->length --;
return ret;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "linkstack.h"
void main()
{
LinkStack *stack = NULL;
int a[5], i = 0;
for (i=0; i<5; i++)
{
a[i] = i+1;
}
stack = LinkStack_Create();
//向栈中 添加 元素
for (i=0; i<5; i++)
{
LinkStack_Push(stack, &a[i]); //抛砖: 栈的结点a[i]==>转换成(适配成) 链表结点 ===>插入到链表库
}
//栈的属性
printf("len:%d \n", LinkStack_Size(stack));
printf("top:%d \n", *( (int *)LinkStack_Top(stack) ) );
/*
//元素 出栈
while (LinkStack_Size(stack) > 0 )
{
int tmp = 0;
tmp = *( (int *)LinkStack_Pop(stack) );
printf("%d ", tmp);
}
*/
LinkStack_Destroy(stack);
printf("hello...\n");
system("pause");
return ;
}