2014-01-19 110 views
0

我用10個節點創建了一個鏈表。我想獲取我在鏈表中​​創建的第一個節點的地址。我得到第一個節點的地址值不正確。這是我寫的代碼:指針運算

#include "singlyLinkedList.h" 
#include <stddef.h> //for NULL 
#include <stdlib.h> //for malloc 
#include <stdio.h> //for printf 

node *pNode; 

void CreateLinkedList() 
{ 
    int i; 
    pNode = (node*)malloc(sizeof(node)); //create space for first node [] 
    for(i=0;i<10;i++) 
    { 
     pNode->element = i; //enter value [0] 
     printf("Value is %d addr is %p\n",pNode->element,pNode); 
     pNode->nextPtr = (node*)malloc(sizeof(node)); //[0]->[]->NULL 
     pNode = pNode->nextPtr; 
    } 
    pNode->nextPtr=NULL; 
} 

//Function to get first node address 
void GetFirstNodeAddress() 
{ 
    pNode = pNode-10*(sizeof(node)); 
    printf("\n *** Value is %p",pNode); 
} 


int main() 
{ 
    CreateLinkedList(); 
    GetFirstNodeAddress(); 
} 
+1

在鏈表實現中不使用指針算術,至少不是不重要的。 – WhozCraig

回答

3

你假設你所做的10個malloc會產生10個連續的地址。你把它當作一個數組來處理,但鏈表中的元素是獨立的。

這些鏈接列表通常工作的方式是您初始化它們並保留稍後返回的第一個指針。然後在尾巴上生長更多的元素。您不能在單個鏈接列表中向後走。

我在earlier post今天

+0

是的,我假設。並感謝您糾正我。這是我從代碼中獲得的輸出。記憶被連續分配,這讓我更加困惑。 :(8e75008,8e75018,8e75028,8e75038,8e75048,8e75058,8e75068,8e75078,8e75088,8e75098) =========================== 減去後的最終值是8e74e28 – user968000

-2

嘗試printf("\n *** Value is %p",(void *) &pNode);。 &通常是最簡單的方法來獲取指針地址

也從我所知道的:pNode = pNode-10*(sizeof(node));是不正確的。

當你在做指針時,它們指向內存中不一定是連續的區域(按照內存順序)。意思是你可以有一個指針指向內存塊5-10,它也有一個指向內存塊83-88的指針。如果您想獲得第一個節點,請創建一個pNode根節點並將您的第一個創建的pNode分配給該節點。然後你可以在一個while循環中遍歷它,也可以打印上面列出的地址或其他任何你喜歡的地址。

2

你不使用鏈表實現指針運算了一個代碼示例,至少不平凡的人。並且你錯誤地填充你的列表。你需要保留頭指針。這是一個這樣的方式來做到這一點:

// Note: do NOT invoke on a non-empty pNode list 
void CreateLinkedList() 
{ 
    node **pp = &pNode; 
    int i; 

    for (i=0;i<10;++i) 
    { 
     *pp = malloc(sizeof(**pp)); 
     (*pp)->element = i; 
     pp = &(*pp)->nextPtr; 
    } 
    *pp = NULL; 
} 

如何使用

就像pNode是一個指向nodepp是一個指向node *。在循環的生命週期中,pp始終保存將要填充新節點分配的下一個指針的地址。在分配和節點設置之後,pp被剛剛創建的節點的nextPtr指針的地址填充。這一直持續到填充結束。在這一點上,pp指向的指針是尾部nextPtr,應該是空終止的(這就是*pp = NULL所做的)。通過調試器中的代碼來更好地瞭解它的工作原理。

就我個人而言,我會將頭指針的地址作爲參數傳遞,但這是讓代碼運行的直接方式。