我试图写一个链表,其限制是节点内的指针必须指向下一个节点的指针。有了这个限制,我将如何访问节点内的变量? 假设节点已定义
struct Node {
int val;
void *next;
}
但是对于每个Node,比如说我们有currentNode和nextNode,我们创建void * next值
currentNode.next = &(nextNode.next);
您将如何创建并高效访问每个节点?
答案 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