zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/develon/p/7740050.html
Copyright © 2011-2022 走看看