2014-01-19 83 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所做的)。通过调试器中的代码来更好地了解它的工作原理。

就我个人而言,我会将头指针的地址作为参数传递,但这是让代码运行的直接方式。