2016-02-13 71 views
-1

我一直在尋找一些示例代碼如何從單鏈表中取消鏈接(而不是刪除)節點。我的目標是取消鏈接節點並存儲其指針,以便稍後可以將其鏈接回鏈接列表中的某處。如何從單鏈表中取消鏈接節點並存儲未鏈接的節點指針?

有誰知道我怎麼能做到這一點?

這是我的結構:什麼我試圖做

struct Courses{ 
     char *courseName; 
     int creditValue; 
     Courses *next; 
    };Courses; 

struct Student{ 
     char *name; 
     int age; 
     Courses *list; //First course (node) for Courses linked list. 
    }Student; 

例子:

我有以下鏈接列表:

1 -> 2 -> 3 -> 4 -> 5 

現在我要取消3將其位置存儲在其他地方。

1 -> 2 -> 4 -> 5 

3 (Stored somwhere) 

然後最後我想鏈接3回到列表中的某處。現在可以說我想要它之後4.

1 -> 2 -> 4 -> 3 -> 5 

希望這有助於進一步解釋。

+0

問題不清楚。你能舉幾個例子嗎? – akashchandrakar

+0

@aksam編輯進一步解釋。 – Stacks

回答

0

「解除鏈接」節點只是更改指向它的節點的next域。

您當然可以保留未鏈接節點的指針,稍後再使用此節點。取消鏈接與釋放分配給節點的內存不同。

例如,下面的函數解除鏈接的第一個節點,並返回:

Courses * GetFirstCourse(Student * s) 
{ 
    Courses * result = s -> list; 
    if (result) 
    { 
     s -> list = result -> next; 
    } 
    return result; 
} 

如果要取消中間的一個節點,那麼你應該跟蹤節點的前面,所以你可以將它們粘貼回鏈接列表。

0

這裏的取消鏈接代碼:

#include <stdio.h> 

typedef struct Courses { 
    char *courseName; 
    int creditValue; 
    struct Courses *next; 
} Courses; 

typedef struct Student { 
    char *name; 
    int age; 
    Courses *list;    // First course (node) for Courses linked list. 
} Student; 

Courses * 
delink(Student *student,Courses *remove) 
{ 
    Courses *prev; 
    Courses *cur; 

    prev = NULL; 

    for (cur = student->list; cur != NULL; prev = cur, cur = cur->next) { 
     if (cur == remove) { 
      if (prev != NULL) 
       prev->next = cur->next; 
      else 
       student->list = cur->next; 
      cur->next = NULL; 
      break; 
     } 
    } 

    return remove; 
} 

請注意,你可能必須要更加明確必要的重新鏈接的條件。也就是說,你想如何「找到」重新插入點等?你想掃描creditValue還是你已經有Courses *insert_after

+0

這是從前面脫鉤的代碼嗎? – Stacks

+0

是的。 [很明顯],它假設你有一個指向你想要刪除的節點的指針[調用者已經根據一些標準找到了這個]。該代碼將從列表中的_any_位置(前面,後面,中間)刪除節點(此處爲'remove')。它不會做「通過數據值搜索節點」,它假定調用者已經完成了該操作。這樣的一體化功能可以是(例如):'課程* find_and_delink(Student * student,char * course_name,int credit_value)'。這就是我在答案底部的意思。你需要考慮你需要什麼/多少列表功能,除了它們是如何實現的 –