2016-08-25 69 views
1

所以我一直在使用C代碼(用於類)。鏈表由相互鏈接的結構組成,我試圖通過鏈表讀取鏈表是否有任何鏈接,因此可以將其刪除。但是,如果鏈接在最後,列表中的第一個鏈接將取代它的位置,因此第二個鏈接將成爲第一個鏈接。一個圖是這樣的:如何更改鏈接列表以便刪除最後一個鏈接,並且第一個鏈接取代它?

A-> B-> C-> D-> E和應該成爲B-> C-> D->一

這就是我的工作。我能夠做到這一點,以便中間的任何鏈接都被刪除,但我被困在最後一部分。任何建議都會很棒。

STUDENT *DeleteByLastName(STUDENT *students, char *name) 
{ 
    STUDENT *pHead = students; 
    STUDENT *prev = NULL; 
    int check; 

    pHead = pHead->Next; 

    while(strcmp(pHead->Lastname, name) != 0 && pHead->Next != NULL){ 
    prev = pHead; 
    pHead = pHead->Next; 
    } 
    check = strcmp(pHead->Lastname, name); 
    if (check == 0){ 
    prev->Next = pHead->Next; 
    return students; 
    } 
    else if (check != 0 && pHead->Next != NULL){ 
    prev = pHead; 
    pHead = pHead->Next; 

    check = strcmp(pHead->Lastname, name); 
     if (check == 0){ 
     pHead = students; 
     prev->Next = pHead; 
     pHead->Next = NULL; 
     students = students->Next; 
     return students; 
     } 
    } 

編輯:幫助澄清我的問題。所以我的主要問題是,我試圖將鏈表的末尾循環到第一個元素,並將它分離以製作B-> C-> D-> A格式。我正在考慮添加結構來保存開始位置以及我想要返回的位置。但是這可能會導致我的程序失敗或進入無限循環。

編輯2:代碼的主體提供了,我將編輯功能來幫助完成任務。第一個是掃描每個鏈接,看看是否有人的姓氏,並刪除該鏈接。然後,我將根據我寫的代碼來創建條件,如果名稱不在我想讓它回到起點的任何鏈接中。最後的任務是使A-B-C-D-E變成B-C-D-A。

EDIT3:它應該如何工作的一個例子: Sanka-> Robbert-> Jordan-> Blunc-> Wei->朱 和名稱進行檢查是朱,所以最終名單應該是這樣的: Robbert-> Jordan-> Blunc-> Wei-> Sanka

+0

「我卡住了」。解釋你爲什麼被卡住。你告訴我們你想做什麼,但沒有解釋爲什麼你不能這樣做。以上代碼的狀態是什麼?它做一些你想要的東西嗎?它試圖做什麼,但崩潰?可以...? – kaylum

+0

一種奇怪的要求..旋轉第一個節點的最後一點是什麼? – yano

+0

你有什麼原始的東西可以幫助你?你有「刪除第一」功能嗎? 「刪除最後」功能? '添加在結束功能'?通過這三個「刪除未鏈接節點」功能,您可以輕鬆完成這項工作。那些特殊情況呢?雙鏈表是特殊的;您將以第一個節點爲唯一節點。單鏈表是特殊的;你最終會得到你開始使用的列表,因爲你刪除了尾部,然後將它添加到結果空列表的尾部? –

回答

0

這裏是我會做: -

你的鏈表是這樣的: -

甲 - >乙 - 「ç - > d - >電子

輸出應該是: - B - > C - > D - > A

首先,遍歷鏈表並維護2個指針,一個在開始時(currentPtr),保持穩定,一個在末尾(tailPtr),使用循環移動它。

使用strcpy(tailPtr -> name, currentPtr -> name)將currentPtr的字符串複製到tailPtr。

所以鏈表現在看起來像

甲 - >乙 - 「ç - > d - >一個

現在,只需你就必須打破它鏈接到B刪除第一個節點,但在此之前,您必須將您的頭更新到節點B.因此,head = currentPtr -> next(它是B節點),然後將其設置爲NULL,以避免非法內存訪問currentPtr -> next = NULL(currentPtr指向A)並最終釋放它free(currentPtr)

輸出:頭 - > B - > C - > D - > A

1

只需存儲您的第一個STUDENT並稍後鏈接它。

STUDENT *DeleteLastAndMoveFirstToLast(STUDENT *students) 
{ 
    STUDENT *pFirst = students; 
    STUDENT *pHead = pFirst->Next; 

    if (!pHead) return 0; 

    STUDENT *pNext = pHead; 
    STUDENT *pNextAfterNext = pNext->Next; 

    if (pNextAfterNext) { 
    while (pNextAfterNext->Next) { 
     pNext = pNext->Next; 
     pNextAfterNext = pNext->Next; 
    } 
    } 

    pNext->Next = pFirst; 
    pFirst->Next = 0; 
    return pHead; 
}