2016-03-02 14 views
-1

我需要模擬一個C類鏈接列表。 我的問題是保存信息,如列表長度,頭,最後節點和平均每個「對象」創建。 含義像progeram C列表類

List *A = ctor() 
addItem(A, 0) 

以及檢查的名單長度將返回2 但如果我不叫B中的另一列表,並添加其他兩個項目,它會顯示3 我不允許使用循環中任何函數(不包括析構函數 - 沒有遞歸和轉到) 老實說,我不能想出一種方法來保存每個「對象」的信息(現在缺少另一個詞) 有什麼建議嗎? 一切都在C 我不想因爲我仍然需要保存不同的信息對每個實例使用簡單的全局變量(中字)

編輯:

結構包含:

int value 
List *next 
List *previous 

,並且不能包含任何多個值

編輯2

我可以添加更多的字段的struct

的要求是: 不要使用循環,遞歸,轉到

列表功能:

1)構造 - 創建一個新的列表

2)破壞 - 刪除所有節點(可以使用該功能中的循環)

3)添加節點

4)刪除節點 - 給定一個指向節點

5)返回列表

6)的長度返回指針到第一節點

7)返回一個指針,指向最後一個節點

8)返回一個指針到下一個節點(給定指針當前)

9)返回一個指向前一節點(給定指針當前)

10)中的節點的返回值(給出一個指向該節點)的列表

11)返回平均值

那它時,這些功能是非常基本的,當所述指令不那麼

限制性

我不知道這是否有很大幫助

+1

使用'struct'來包含所需的數據。類只是具有自動構造函數/析構函數和相關函數的「struct」。 – Kupiakos

+0

「檢查A的列表長度將返回2」。爲什麼?你已經添加了1項,長度是2?無論如何,爲什麼你不能在List結構中添加一個計數器字段呢?並添加更多的領域,你需要跟蹤的任何其他事情。 – kaylum

+0

太寬了。但是要做一些自我檢索。關鍵字可能是「面向對象的C編程」 – Olaf

回答

1

免責聲明:我是假設你的函數的ns只能和節點一起工作,這就是爲什麼我隱藏了調用者的列表結構,導致了API的混亂。


OK,這是要贏得最糟糕的API獎,但這裏有一個可能的解決方案:

struct node; 

struct list { 
    int sum; 
    size_t count; 
    struct node * head, * end; 

struct node { 
    struct node * next, * previous; 
    struct list * list; 
    int value; 
}; 

struct node * allocate_list(void) { 
    struct node * sentinel = malloc(sizeof(*sentinel)); 
    struct list * list = malloc(sizeof(*list)); 
    sentinel->previous = sentinel->next = NULL; 
    list->head = list->end = sentinel; 
    list->sum = 0; 
    list->count = 0; 
    sentinel->list = list; 
    return sentinel; 
} 

void free_list(struct node * n) { 
    struct list * list = n->list; 
    n = list->head; 
    while (n != list->end) { 
    n = n->next; 
    free(n->previous); 
    } 
    free(n); 
    free(list); 
} 

void add_item(struct node * n, int value) { 
    struct node * new = malloc(sizeof(*new)); 
    new->previous = n->previous; 
    n->previous = new; 
    new->next = n; 
    new->value = value; 
    new->list = n->list; 
    if (new->previous == NULL) { 
    new->list->head = new; 
    } 
    ++(new->list->count); 
    new->list->sum += value; 
} 

的函數的功能應該是微不足道的,並不會絕對不需要任何循環或遞歸。

關鍵的想法是將指向整個列表共享數據的指針存儲到每個節點。這個共享數據因此可以從任何節點訪問和修改。

+0

我採取了不同的方法,但感謝您的時間! 它確實幫了我 – Yarden

+0

@Yarden,如果你想讓你可以分享你的做法,發佈它作爲答案。 (在這裏回答你的產品問題是可以的) –