簡體   English   中英

C-需要幫助實施ADT

[英]C - Need help implementing an ADT

我正在做學校作業,但在理解如何使用ADT時遇到了麻煩。 基本上,我需要實現一個存儲<key, value>對的符號表ADT。 與鍵關聯的值是用戶定義的任意對象,該對象由void指針傳遞給ADT。 我已經包含了頭文件,我只需要為其創建源文件。

我堅持的聲明是針對結構本身的。 它是由SymTable_T類型的指針指向的符號表對象。 它應該能夠插入<key, value>對的副本,並且當從表中刪除或表本身被破壞時,這些副本也應該被破壞。

該實現應采用哈希表,該哈希表使用鏈接來解決沖突。 我已經熟悉哈希,因此沒有麻煩。

這是我想出的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "symTable.h"
#define DEFAULT_TABLE_SIZE 61
#define HASH_MULTIPLIER 65599

typedef struct SymTable *SymTable_T;
{
    char *key;
    int value;
    struct SymTable *next; //linked list
}; 

有人可以指出我正確的方向嗎? 有人可以向我解釋實施ADT的必要條件嗎? 提前非常感謝您!

抽象數據類型的本質在於,客戶端代碼對這種類型的值的結構沒有任何了解-這也意味着處理此類值的任何函數的實現都是不透明的。

在您的示例中,這意味着您沒有在頭文件中定義struct ,而僅使用前向聲明。 對於遍歷,您可能還需要定義一個同樣不透明的迭代器類型,例如

struct symtable;
struct symtable_iterator;

...然后是使用該表的函數的集合,例如

/* Create symtable, destroy it, insert values. */
void symtable_alloc(struct symtable **table);
void symtable_free(struct symtable *table);
void symtable_insert(struct symtable *table, const char *key, void *value);

/* Create symtable iterator, destroy it, access key/value. */
void symtable_iterator_alloc(struct symtable *table, struct symtable_iterator **it);
void symtable_iterator_free(struct symtable_iterator *it);
bool symtable_iterator_next(struct symtable_iterator **it);
const char *symtable_iterator_key(struct symtable_iterator *it);
void *symtable_iterator_value(struct symtable_iterator *it);

那就是您應該放入頭文件中的全部內容。 在實現( .c )文件中,您實際上將定義結構及其字段-但是該代碼對於客戶端是隱藏的。

你可以像這樣使用它們

struct symtable *table;
symtable_alloc(&table);
symtable_insert(table, "one", "eins");
symtable_insert(table, "two", "zwei");
symtable_insert(table, "three", "drei");

struct symtable_iterator *it;
symtable_iterator_alloc(table, &it);
while (symtable_iterator_next(&it)) {
   printf("%s: %s\n", symtable_iterator_key(it), symtable_iterator_value(it));
}
symtable_iterator_free(it);
symtable_free(table);

請注意,函數集如何清楚地定義數據結構的API,但實際類型是抽象的-沒有信息可以放棄表的實現,例如,是鏈表,哈希表還是其他。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM