C 栈 链式存储

#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 ;
}

 

posted @ 2015-09-15 19:43  无天666  阅读(198)  评论(0编辑  收藏  举报