2014-01-19 3 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 rootNode를 만들고 처음 생성 한 pNode를 그 노드에 할당하십시오. 그런 다음 위에 나온 주소 나 다른 주소를 인쇄 할 때뿐만 아니라 while 루프에서이를 트래버스 할 수 있습니다.

2

에서 사소한 것들을 코드 예제를했다. 그리고 목록을 잘못 채우고 있습니다. 헤드 포인터를 유지해야합니다. 이 그것을 할 수있는 하나의 방법이다 : 그것은 그냥 pNode 같은

node에 대한 포인터 작동 방법

// 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; 
} 

, ppnode *에 대한 포인터입니다. 루프 pp의 수명 동안 항상 새로운 노드 할당으로 가득하는 방법에 대한 다음 포인터의 주소를 보유하고 있습니다. 할당 및 노드 설정 후 pp은 방금 생성 된 노드의 nextPtr 포인터의 주소로 채워집니다. 채우기가 끝날 때까지이 작업이 계속됩니다. 이 시점에서 pp으로 주소 지정된 포인터는 꼬리가 nextPtr이고 null로 끝나야합니다 (이는 *pp = NULL입니다). 디버거에서이 코드를 단계별로 실행하여 작동 방식을 개선하십시오.

는 개인적으로 난 매개 변수로 헤드 포인터의 주소를 전달할 것입니다, 그러나 이것은 당신의 코드 실행을 얻을 수있는 하나의 즉각적인 방법입니다.