//linklist.h
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
#include<stdio.h>
typedef void LinkList;
typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode *next;
}LinkListNode;
LinkList *LinkList_Create();
void LinkList_Clear(LinkList *list);
void LinkList_Destroy(LinkList *list);
int LinkList_Length(LinkList *list);
int LinkList_Insert(LinkList *list, LinkListNode *node, int pos);
LinkListNode *LinkList_Delete(LinkList *list, int pos);
LinkListNode *LinkList_Get(LinkList *list, int pos);
#endif
//linkstack.h
#pragma once
typedef void LinkStack;
LinkStack* LinkStack_Create();
void LinkStack_Clear(LinkStack *stack);
void LinkStack_Destroy(LinkStack *stack);
int LinkStack_Size(LinkStack *stack);
int LinkStack_Push(LinkStack *stack,void *item);
void *LinkStack_Pop(LinkStack *stack);
void *LinkStack_Top(LinkStack *stack);
//linklist.cpp
#include "linklist.h"
#include<stdlib.h>
typedef struct _tag_LinkList
{
LinkListNode header;
int length;
}TLinkList;
LinkList *LinkList_Create()
{
TLinkList *ret = (TLinkList *)malloc(sizeof(TLinkList));
if (ret == NULL)
{
printf("LinkList_Create err:malloc err\n");
return NULL;
}
ret->header.next = NULL;
ret->length = 0;
return ret;
}
void LinkList_Clear(LinkList *list)
{
TLinkList *tlist = (TLinkList*)list;
if (list == NULL)
{
printf("LinkList_Clear err\n");
return;
}
tlist->header.next = NULL;
tlist->length = 0;
}
void LinkList_Destroy(LinkList *list)
{
if (list != NULL)
{
free(list);
}
else
{
printf("LinkList_Destroy err\n");
}
}
int LinkList_Length(LinkList *list)
{
TLinkList *tlist = (TLinkList*)list;
if (list == NULL)
{
printf("LinkList_Length err\n");
return -1;
}
return tlist->length;
}
int LinkList_Insert(LinkList *list, LinkListNode *node, int pos)
{
int i = 0;
TLinkList *tlist = (TLinkList *)list;
LinkListNode *current = NULL;
if (list == NULL || node == NULL || pos < 0)
{
printf("LinkList_Insert err\n");
return -1;
}
current = (LinkListNode*)tlist;
for (i = 0; i < pos&¤t->next != NULL; i++)
{
current = current->next;
}
node->next = current->next;
current->next = node;
tlist->length++;
return pos;
}
LinkListNode* LinkList_Get(LinkList *list, int pos)
{
int i = 0;
TLinkList *tlist = (TLinkList *)list;
LinkListNode *current = NULL;
LinkListNode *ret = NULL;
if (list == NULL || pos < 0)
{
printf("LinkList_Get err\n");
return NULL;
}
current = (LinkListNode*)tlist;
for (i = 0; i < pos&¤t->next != NULL; i++)
{
current = current->next;
}
ret = current->next;
if (ret == NULL)
{
printf("LinkList_Get err\n");
return ret;
}
return ret;
}
LinkListNode *LinkList_Delete(LinkList *list, int pos)
{
int i = 0;
TLinkList *tlist = (TLinkList *)list;
LinkListNode *current = NULL;
LinkListNode *ret = NULL;
if (list == NULL || pos < 0)
{
printf("LinkList_Delete err\n");
return NULL;
}
current = (LinkListNode *)tlist;
for (i = 0; i < pos&¤t->next != NULL; i++)
{
current = current->next;
}
ret = current->next;
current->next = ret->next;
tlist->length--;
return ret;
}
//linkstack.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "linklist.h"
#include "linkstack.h"
typedef struct _tag_LinkStackNode
{
LinkListNode node;
void *item;
}TLinkStackNode;
LinkStack *LinkStack_Create()
{
return LinkList_Create();
}
void LinkStack_Clear(LinkStack *stack)
{
while (LinkStack_Size(stack) > 0)
{
LinkStack_Pop(stack);
}
}
void LinkStack_Destroy(LinkStack *stack)
{
LinkStack_Clear(stack);
LinkList_Destroy(stack);
}
int LinkStack_Size(LinkStack *stack)
{
return LinkList_Length(stack);
}
int LinkStack_Push(LinkStack *stack, void *item)
{
int ret = 0;
TLinkStackNode *tmp = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));
if (tmp == NULL)
{
ret = -1;
printf("LinkStack_Push err %d\n", ret);
return ret;
}
tmp->item = item;
ret = LinkList_Insert(stack, (LinkListNode*)&tmp->node,0);
if (ret != 0)
{
ret = -2;
printf("LinkStack_Push err %d\n", ret);
}
return ret;
}
void *LinkStack_Pop(LinkStack *stack)
{
void *ret = NULL;
TLinkStackNode *tmp = NULL;
tmp = (TLinkStackNode *)LinkList_Delete(stack, 0);
if (tmp == NULL)
{
printf("LinkStack_Pop err:LinkList_Delete\n");
return NULL;
}
ret = tmp->item;
free(tmp);
return ret;
}
void *LinkStack_Top(LinkStack *stack)
{
TLinkStackNode *tmp = (TLinkStackNode *)LinkList_Get(stack, 0);
if (tmp == NULL)
{
printf("LinkStack_Top err\n");
return NULL;
}
return tmp->item;
}
//栈的链式存储设计与实现
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "linkstack.h"
void main()
{
int a[10], i;
LinkStack *stack = NULL;
stack = LinkStack_Create();
for (i = 0; i<10; i++)
{
a[i] = i + 1;
LinkStack_Push(stack, &a[i]);//把对象地址压入栈
}
printf("top: %d \n", *((int *)LinkStack_Top(stack)));//将返回的void *类型指针转为int *指针,然后取指针的值
printf("size: %d \n", LinkStack_Size(stack));
//删除栈中所有元素
while (LinkStack_Size(stack) > 0)
{
printf("linkstack pop: %d \n", *((int*)LinkStack_Pop(stack)));
}
LinkStack_Destroy(stack);
system("pause");
}