代码之家  ›  专栏  ›  技术社区  ›  user366312

如何实现动态链表的容量?

  •  2
  • user366312  · 技术社区  · 14 年前

    我知道在OOP语言中将它用作ADT时很容易实现。

    我应该使用全局变量吗?

    或者什么?

    我已经实现了我的动态堆栈 this

    如您所见,没有容量检查。

    2 回复  |  直到 14 年前
        1
  •  3
  •   paxdiablo    14 年前

    如果要对链接列表实施容量限制,最好的方法是对每个列表进行限制。以下结构将允许:

    // List structure: first/last pointers plus remaining capacity.
    typedef struct {
        tNode *first;
        tNode *last;
        size_t freeCount;
    } tList;
    
    // Node structure: value pointer and next.
    typedef struct sNode {
        void *val;
        struct sNode *next;
    } tNode;
    

    然后,您在每个列表中初始化您的限额:

    // Creates an empty list.
    tList *makeList (size_t limit) {
        tList *list = malloc (sizeof (tList));
        if (list == NULL)
            return NULL;
        list->freeCount = limit;
        list->first = list->last = NULL;
    }
    
    // Destroys a list after clearing it if necessary.
    void destroyList (tList list) {
        void *val = getNode (list);
        while (val != NULL) {
            free (val);
            val = getNode (list);
        }
        free (list);
    }
    

    freeCount 为零,否则将添加一个节点并递减 . 删除节点将增加 自由计数 ,类似于:

    // Puts an item on to the list end.
    int putNode (tList *list, void *val, size_t sz) {
        // No more capacity.
        if (list->freeCount == 0) return -1;
    
        // Try to make node, returning error if no memory.
        tNode *node = malloc (sizeof (tNode));
        if (node == NULL) return -1;
    
        // Try to duplicate payload, clean up and return if no memory.
        node->val = malloc (sz);
        if (node->val == NULL) {
            free (node);
            return -1;
        }
    
        // Initialise node.
        memcpy (node->val, val, sz)
        node->next = NULL;
    
        // Adjust remaining capacity and insert into list.
        list->freeCount--;
        if (list->first == NULL) {
            list->first = list->last = node;
        } else {
            list->last->next = node;
            list->last = node;
        }
    
        return 0;
    }
    

    // Gets an item from the list.
    void *getNode (tList *list) {
        // If empty, just return NULL.
        if (list->first == NULL)
            return NULL;
    
        // Get first node and remove it from list.
        tNode node = list->first;
        list->first = list->first->next;
    
        // Get the payload and free the node.
        void *val = node->val;
        free (node);
    
        // Adjust remianing capacity and return payload.
        list->freeCount++;
        return val;
    }
    

    注意所有正常的错误情况(没有内存,列表为空等等) 以及 当您已经达到最大容量时(当 自由计数 是零)。

        2
  •  1
  •   codaddict    14 年前