2017-10-05 126 views
0

我試圖寫一個鏈接列表,其限制是節點內的指針必須指向下一個節點的指針。有了這個限制,我將如何訪問節點內的變量? 說出節點被定義鏈接列表,但每個「下一個」指針指向下一個節點的「下一個」指針

struct Node { 
    int val; 
    void *next; 
} 

但對於每一個節點,假設我們有currentNode和nextNode,我們提出void *的下一個值

currentNode.next = &(nextNode.next); 

你會如何去創造這一點,並有效地訪問各節點?

+0

爲什麼你有這樣的限制?爲什麼你將它聲明爲'void *'而不是'struct node **'? – Barmar

+2

'next'指針從結構開始就是某個[* offset *](http://en.cppreference.com/w/c/types/offsetof)。儘管非常沮喪,但您可以通過一些簡單的算法獲得指向結構的指針。 –

+0

這是一個學校作業,我們不能修改結構。我們必須編寫一個與這樣的列表一起工作的函數,但我需要了解列表的工作方式,然後才能做到這一點。我找不到像這樣的列表的任何例子。限制在這個賦值中,void * next指向下一個節點中的下一個字段,而不是節點的開始。也就是說,curr_node.ptr =&(next_node.ptr);不curr_node.ptr =&next_node – Avallauch

回答

3

通過使用offsetof運算符減去next的偏移量,可以獲得指向Node的指針。

struct Node *nextNode = (struct Node *)((char *)currentNode.next - offsetof(Node, next)); 
int nextVal = nextNode->val; 

如果你使用的C99,不具有offsetof()內置的,你可以用這個傳統的宏:

#define offsetof(st, m) ((size_t)&(((st *)0)->m)) 

這在技術上是未定義的行爲(見Does &((struct name *)NULL -> b) cause undefined behaviour in C11?),但它通常工作。

+1

我相信這基本上是答案@某些程序員哥們給了。 – liamnickell

+1

請注意,'offsetof'在C89中不可用。 – tilz0R

+0

的確如此,但我認爲這是一個已經使用多年的宏。 – Barmar

1

使用適當的結構,這樣的限制本質上是滿意:

struct Node { 
    void *next; 
    int val; 
} 

需要顯式指針運算。

0

我按照您的要求實施鏈接列表。希望這會幫助你。在這個鏈接列表中,節點內的每個指針指向下一個節點指針。

請在你的程序stdio.h中,memory.h的頂部添加這3頭文件和STDLIB.H這一計劃的

struct Node { 
    int val; 
    void *next; 
}; 


void main(void) 
{ 
    typedef struct Node NODE; 
    NODE *f,*p,*q = NULL; 
    int i = 1; 
    /* First create your first node here */ 
    f = (NODE *)malloc(sizeof(NODE)); 
    f->next = f; 
    f->val = 0; 
    p = f; 

/* now lets create link list with 10 nodes */ 
    while(i < 10) 
    { 
    q = (NODE *)malloc(sizeof(NODE)); 
    q->next = q; 
    q->val = i++; 
    p->next = q->next; /* first node is pointing to the next node pointer */ 
    p = q; 
    } 

    /* search the link list and print its value */ 
    p = f; /* now p is pointing to the first node of the link list */ 
    i = 0; 
    /* first print the value of first node here */ 
    printf("Node :%d and val = %d\n", i, p->val); 
    while(p->next != p) 
    { 
     printf("Node :%d and val = %d\n", i++, ((NODE *)(p->next))->val); 
     p = p->next; 
    } 
} 

輸出;

節點:0和val = 0

節點:1和val = 1

節點:2和val = 2

節點:3和val = 3

節點: 4和val = 4

節點:5和val = 5

節點:6和val = 6

節點:7和val = 7

節點:8和val = 8

節點:9和Val = 9

+0

謝謝!這種可視化幫助。我設法讓它工作,這個想法是你使用偏移像(&(node-> ptr) - 0x4);這將指向一個節點的開始。 – Avallauch

相關問題