链接列表,但每个" next"指针指向下一个节点" next"指针

时间:2017-10-05 03:35:54

标签: c pointers linked-list

我试图写一个链表,其限制是节点内的指针必须指向下一个节点的指针。有了这个限制,我将如何访问节点内的变量? 假设节点已定义

struct Node {
    int val;
    void *next;
}

但是对于每个Node,比如说我们有currentNode和nextNode,我们创建void * next值

currentNode.next = &(nextNode.next);

您将如何创建并高效访问每个节点?

3 个答案:

答案 0 :(得分:3)

您可以使用Node运算符减去next的偏移量,从而获得指向offsetof的指针。

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

如果您正在使用内置offsetof()的C99,则可以使用此传统宏:

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

技术上未定义的行为(请参阅Does &((struct name *)NULL -> b) cause undefined behaviour in C11?),但它通常有效。

答案 1 :(得分:1)

使用适当的结构,以便本质上满足限制:

struct Node {
    void *next;
    int val;
}

不需要显式指针算法。

答案 2 :(得分:0)

我正在根据您的要求实施链接列表。希望这会对你有所帮助。在此链接列表中,节点内的每个指针都指向下一个节点指针。

请在程序stdio.h,memory.h和stdlib.h的顶部添加这3个头文件

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