2016-02-11 34 views
-2

首先,我定義一個結構來實現鏈表:執行用C鏈接列表,而無需輸入尺寸

typedef struct node 
{ 
    int data; 
    struct node *next; 
} Node; 

然後,我必須的元素插入到鏈接列表。我無法完成這部分。

一個例子,從我的講義告訴我,當我們插入的元素,我們應該做這樣的事情:

Node a, c; // originally 
Node b; // insert-element 
b->next = &c; 
a->next = &b; 

不過,我必須聲明一個節點來實現它。但是,這裏是我的情況:我不知道輸入大小,也許我必須插入60個元素,或者我只需要插入2個元素。解決辦法是什麼?

另一個小而愚蠢的問題是,它在a->nexta.next之間有什麼不同嗎?

+2

你應該閱讀有關指針和動態內存分配('malloc'和朋友)第一。 'a-> next'與'(* a).next'相同。 –

+0

【鏈接列表教程】(http://pastebin.com/HC1DLK4M) – sp2danny

+0

請評論你的downvote的帖子,讓OP知道如何改進這個問題 – sp2danny

回答

1

如果您不知道將獲得多少個節點,則必須在運行時分配內存。 malloc()free()將完成這項工作。

a->nexta.next之間的區別實際上是a。 在第一個構造中,「a」是指向結構的指針,在第二種情況下,「a」是結構本身。

3

這是如何實現的空鏈表:

typedef struct node 
{ 
    int data; 
    struct node *next; 
} Node; 

int main(){ 

    Node *a, *b; 

    a=malloc(sizeof(Node)); 
    //here check if allocation has been done, if not error 
    a->data=1; 
    a->next=NULL; 


    b=malloc(sizeof(Node)); 
    b->data=2; 
    b->next=a; 

    //and so on 




    return 0; 
} 

這樣你的鏈接列表就會像: b ---->一個-----> NULL 現在讓我們假設你想在鏈表的末尾添加3;你可以使用這個功能:

void insertToEnd(Node *head, int newNumber) 
{ 
    Node *newNode, *tmp; 
    newNode=malloc(sizeof(Node)); 
    newNode->data=newNumber; 
    newNode->next=NULL; 

    tmp=head; 

    if(head->next == NULL){ 
    head->next = newNode; 
    } 

    else 
    { 
    while(tmp->next != NULL) 
    { 
     if(tmp->next == NULL) 
     { 
      tmp->next = newNode; 
     } 
     tmp = tmp->next; 
    } 
} 


head=tmp; 
} 

我希望它能正常工作,因爲我現在沒有c編譯器。檢查它並讓我知道,如果功能正常工作

+0

[請不要在C]中輸入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。 – unwind

+0

@unwind你的意思是b = malloc(sizeof(Node)); ? – reshad

+0

你應該點擊鏈接。 :)但是,或甚至更好'b = malloc(sizeof * b);'。 – unwind

2

明智的是創建一個函數,將一個新的列表節點添加到現有列表中。我們使用NULL來表示「空白列表」。我們預先安排好了,因爲每次都省去了整個列表。

Node * list_prepend(Node *head, int data) 
{ 
    Node *n = malloc(sizeof *n); 
    if(n != NULL) 
    { 
    n->next = head; 
    n->data = data; 
    return n; /* The new head. */ 
    } 
    return head; 
} 

然後使用它像這樣:

int main(void) 
{ 
    Node *list; 

    list = list_prepend(NULL, 47); 
    list = list_prepend(list, 11); 
}