• C语言


    单链表:linkList.h linkList.c

     1 #ifndef LINKLIST_H_INCLUDE
     2 #define LINKLIST_H_INCLUDE
     3 #include <Windows.h>
     4 
     5 //什么是链表 是一种动态数组 管理一堆不断变化的元素
     6 
     7 typedef struct e{
     8     void *data;//元素通过一个万能的指针指向代表的数据
     9     struct e *next;//指向下一个元素
    10 }E, *PE;
    11 
    12 //单链表 对象属性:一个元素句柄 元素个数
    13 typedef struct linkList{
    14     PE handler;//元素的句柄
    15     int count;//元素的总数
    16 }LinkList, *PLinkList;
    17 
    18 //以下是接口
    19 
    20 //实例化一个元素 最常用的构造方法:直接指定数据
    21 PE newE(void *);
    22 //实例化一个空链表
    23 PLinkList newLinkList();
    24 //
    25 PE LinkList_get(PLinkList, int);
    26 //
    27 BOOL LinkList_del(PLinkList, int);
    28 //
    29 BOOL LinkList_set(PLinkList, int, PE);
    30 //
    31 BOOL LinkList_add(PLinkList, int, PE);
    32 //叛空
    33 BOOL LinikList_isEmpty(PLinkList);
    34 //取数量
    35 int LinkList_getCount(PLinkList);
    36 
    37 #endif
    linkList.h
     1 #include "linkList.h"
     2 #include <stdlib.h>
     3 #include <assert.h>
     4 
     5 //实例化一个元素 最常用的构造方法:直接指定数据
     6 PE newE(void *data){
     7     PE r = NULL;
     8     r = (PE) malloc(sizeof(E));
     9     r->data = data;
    10     r->next = NULL;
    11     return r;
    12 }
    13 //实例化一个空链表
    14 PLinkList newLinkList(){
    15     PLinkList r = NULL;
    16     r = (PLinkList) malloc(sizeof(LinkList));
    17     r->count = 0;
    18     r->handler = newE(NULL);
    19     return r;
    20 }
    21 //
    22 PE LinkList_get(PLinkList list, int id){//id:[0,n]
    23     int i = 0;
    24     PE e = NULL;
    25     assert(list!=NULL);
    26     assert(id>=0&&id<=list->count);
    27     e = list->handler;
    28     for(i=1;i<=id;i++){
    29         e = e->next;
    30     }
    31     return e;
    32 }
    33 //
    34 BOOL LinkList_del(PLinkList list, int id){//id[1,n]
    35     //assert(list);
    36     //assert(id>=1&&id<=list->count);
    37     if(!list|| id<1|| id>list->count) return FALSE;
    38     //id-1->next=id->next
    39     LinkList_get(list, id-1)->next = LinkList_get(list, id)->next;
    40     list->count--;
    41     return TRUE;
    42 }
    43 //
    44 BOOL LinkList_set(PLinkList list, int id, PE e){//id:[1,n]
    45     if(!list|| !e|| id<1|| id>list->count) return FALSE;
    46     e->next = LinkList_get(list, id)->next;
    47     LinkList_get(list, id-1)->next = e;
    48     return TRUE;
    49 }
    50 //
    51 BOOL LinkList_add(PLinkList list, int id, PE e){//id:[1,n+1]=>[1,~)
    52     assert(list&&e);
    53     if(id>list->count+1)
    54         id = list->count+1;
    55     assert(id>=1&&id<=list->count+1);
    56     //e连接id-1->next,id-1连接e
    57     e->next = LinkList_get(list, id-1)->next;
    58     LinkList_get(list, id-1)->next = e;
    59     list->count++;
    60     return TRUE;
    61 }
    62 //叛空
    63 BOOL LinikList_isEmpty(PLinkList list){
    64     assert(list);
    65     if(list->count==0)
    66         return TRUE;
    67     return FALSE;
    68 }
    69 //取数量
    70 int LinkList_getCount(PLinkList list){
    71     assert(list);
    72     return list->count;
    73 }
    linkList.c

    栈:stack.h stack.c

     1 #ifndef STACK_H_INCLUDE
     2 #define STACK_H_INCLUDE
     3 #include <Windows.h>
     4 #include "linkList.h"
     5 /**
     6  *对象:栈
     7  *属性:链表指针 栈帧
     8  *接口:实例化 入栈 弹栈 取栈顶元素 叛空 取元素数量
     9  */
    10 typedef struct stack{
    11     PLinkList list;//链表
    12     int top;//栈顶
    13 }Stack, *PStack;
    14 
    15 //以下为接口
    16 
    17 PStack newStack();//实例化一个空栈
    18 BOOL Stack_push(PStack, void*);//入栈
    19 void *Stack_pop(PStack);//弹栈
    20 void *Stack_getTop(PStack);//取栈顶元素但不弹出 相当于将该元素弹栈使用后又入栈
    21 BOOL Stack_isEmpty(PStack);//叛空
    22 int Stack_getCount(PStack);//取栈剩余元素数量
    23 
    24 
    25 #endif
    stack.h
     1 #include "stack.h"
     2 #include "linkList.h"
     3 #include <assert.h>
     4 #include <stdlib.h>
     5 
     6 //实例化一个空栈
     7 PStack newStack(){
     8     PStack r = NULL;
     9     r = (PStack) malloc(sizeof(Stack));
    10     r->top = 0;
    11     r->list = newLinkList();
    12     return r;
    13 }
    14 //入栈
    15 BOOL Stack_push(PStack stack, void* data){
    16     assert(stack);
    17     //创建一个新元素, 添加到表头(方便弹栈)
    18     if(LinkList_add(stack->list, 1, newE(data)) ){
    19         stack->top++;
    20         return TRUE;
    21     }
    22     return FALSE;
    23 }
    24 //弹栈
    25 void *Stack_pop(PStack stack){
    26     assert(stack);
    27     if(stack->top>0&&stack->list->count>0){
    28         PE e = LinkList_get(stack->list, 1);
    29         if(e){
    30             stack->top--;;
    31             LinkList_del(stack->list, 1);
    32             return e->data;
    33         }
    34     }
    35     return NULL;
    36 }
    37 void *Stack_getTop(PStack stack){
    38     PE e = NULL;
    39     assert(stack);
    40     if(stack->top> 0  && stack->list->count> 0 ){
    41         e = LinkList_get(stack->list, 1);
    42     }
    43     return e? e->data: NULL;
    44 }
    45 //叛空
    46 BOOL Stack_isEmpty(PStack stack){
    47     return !stack->top;
    48 }
    49 //取栈剩余元素数量
    50 int Stack_getCount(PStack stack){
    51     assert(stack);
    52     return stack->top;
    53 }
    stack.c
  • 相关阅读:
    Centos 配置网易YUM源
    JDK 变量配置
    redis如何解决key冲突?
    大数据技术(1)流式计算与Storm
    20151211小问题
    返回顶部
    20151210小问题2
    20151210小问题
    20151209小问题
    前端程序员的自我修养
  • 原文地址:https://www.cnblogs.com/develon/p/7740050.html
Copyright © 2020-2023  润新知