2014-10-07 110 views
0

我是C新手,我想寫一個鏈接列表,其中每個節點只包含一個int。結構的定義是可以的,但我也想編寫方法來更新這個鏈表(在尾部添加元素並刪除頭元素)。 (我想能夠讀取最近添加的元素)創建一個鏈表來實現隊列

我寫了下面的函數,但我不知道應該在哪裏發生這個函數以及如何實現它。任何人都可以幫助我嗎?

typedef struct Node{ 
    Node next = NULL; 
    int number; 
} Node; 

void add_node(Node *LL,int val){ 
    // add node to the end of the linked list 
    new_node = (struct Node *)malloc(1*sizeof(struct Node)); 
    new_node->number = val; 
    Node n = *LL; 
    while (n.next != NULL){ 
     n = n.next; 
    } 
    n.next = new_node; 
} 

void delete_head(Node *LL){ 
    // update the head 
    *LL = LL->next; 
    //free? 
} 

void update_LL(*LL,int val){ 
    add_node(*LL,val); 
    delete_head(*LL); 
} 
+1

'節點下一= NULL;' - >'結構Node * next;'in C. – BLUEPIXY 2014-10-07 15:57:00

+1

正如所寫,沒有辦法從'delete_head'內更新頭部:它傳遞一個指向頭節點的指針,但不知道該值的存儲位置,因此無法更新它。你可以(正如很多人所說的那樣)刪除那個節點,但是跟蹤頭部的任何東西都需要更新到新的頭部。 – 2014-10-07 16:06:58

回答

0

試着改變*LL = LL->next;Node *nextNode = LL->next;。 然後您可以撥打free(LL),然後再撥LL = nextNode

void delete_head(Node *LL){ 
    Node *nextNode = LL->next; 
    free(LL); 
    LL = nextNode; 
} 

這就釋放了Node在頭部和指針移動到鏈接列表中的下一個。

+3

因爲'LL'實際上是一個局部變量,所以它不會*移動頭部。 – 2014-10-07 16:00:58

+0

@Scott LL不是一個變量,它的一個指針 – 2014-10-07 16:05:46

+0

@MurtazaZaidi:Is是一個變量,其類型是一個指針。 – 2014-10-07 16:06:33

0

也許這個問題LinkedList - How to free the memory allocated using malloc

的副本基本上你存儲指向要刪除,否則你會泄漏內存,因爲會在代碼中任何地方存儲位置沒有引用的節點。

在你的delete_head函數中試試這個:

Node * temp = LL;

* LL = LL-> next;

free(LL);

希望這會有所幫助!

+2

'temp'和'* LL'不具有相同的類型;就此而言,'LL'和'LL-> next'都不會。 – 2014-10-07 16:03:01

+0

你確定嗎?所有這些都是節點指針 – 2014-10-07 16:16:12

+0

不要相信我;問一個編譯器。 – 2014-10-07 16:18:03

0

您需要在刪除當前節點之前將鏈接保存到下一個節點。否則,你將無法引用鏈表的任何節點。現在,當您將鏈接備份到下一個節點時,可以釋放由LL指向的當前節點,然後將LL指針指定給先前在臨時指針中備份的下一個節點。

Node *temp = LL->next; 
free(LL); 
LL = temp; 
+0

因爲'LL'實際上是一個局部變量,所以這將*不*移動頭部。 – 2014-10-07 16:08:23

+0

@ScottHunter請查看這個http://www.nongnu.org/c-prog-book/online/x641.html – 2014-10-07 16:10:42

+0

如果指針作爲參數傳遞,它指向一個內存位置,無論在該內存上執行什麼操作無論在哪個範圍內都是永久性的功能。 – 2014-10-07 16:11:28

1

我命名你的數據結構是這樣的:

struct pointer 
      { 
      int field; 

      struct pointer *link; 
      }; 
typedef struct pointer cell; 

然後我們就可以使用此功能爲你的需要:

void ad_an_element_at_the_end_of_the_list() 
     { 
     cell *p=NULL; 
     cell *ptr=head; 

     int value; 

     cout<<" Integer number to insert at the end of the list: "; 
     cin>>value; 
     p=(cell*)malloc(sizeof(cell)); 
     p->field=value; 
     p->link=NULL; 
     if(ptr==NULL) 
      { 
      ptr=p; 
      head=ptr; 

      }else 
       { 
       if(ptr->link==NULL) t 
        { 
        ptr->link=p; 
        head=ptr; 

        }else 
        { 
         while(ptr->link!=NULL) 
         { 
         ptr=ptr->link; 
         } 
        ptr->link=p; 

        } 
      } 
    }