我有一个结构:
struct structname
{
structname** link;
int total;
}
我想将structname1
与structname2
相关联。我做的是:
int *ptr = &structname2;
structname1 -> link = &ptr;
然后我尝试访问structname1
的{{1}}链接:
structname2
这是正确的方法吗?当我试图打印出来时,打印出一些未知的符号。有人可以帮我弄这个吗?感谢。
答案 0 :(得分:1)
你必须采用以下方式。
struct structname structname1, structname2; //define two structures structname1 and structname2 of type structname.
struct structname * ptr; // ptr is a pointer to struct of type structname.
struct structname ** ptr2 // ptr2 is a double pointer to struct of type structname.
ptr = &structname2; // ptr points to structname2
ptr2 = &ptr; // ptr2 points to ptr and ptr points to structname2;
structname1.link = ptr2; // now link is a double pointer to structname2.
如果我错了或遗失,请让我纠正
答案 1 :(得分:0)
您的代码中存在一些问题。首先,您得到ptr
错误的类型:它应该是struct structname **
而不是int *
。
但是,如果您尝试进行链接列表,则根本不需要双重间接级别。这很可能是你想要的:
struct structname
{
struct structname *link;
int total;
}
这样,将structname1
与structname2
关联起来很简单(假设structname1
和structname2
属于struct structname
类型):
struct structname *ptr = &structname2;
structname1.link = ptr;
如果structname1
和structname2
的类型为struct structname *
,那么您需要这样做:
struct structname *ptr = structname2;
structname1->link = ptr;
您也可以删除中间变量ptr
,它在这里用处不大。
答案 2 :(得分:0)
struct node {
struct node *next;
int cargo;
}
struct node *current, *last, *next;
unsigned char i;
current = (struct node*)(calloc(sizeof(struct node)));
for (last = current, unsigned char i = 5; i--;) {
next = (struct node*)(calloc(sizeof(struct node)));
next->cargo = i;
last->next = next;
}
上面的代码是一个非常简单的链表。请注意,与代码相比,我更改了一些内容。我使用calloc
创建对象,这意味着对象将分配在堆而不是堆栈上。这也不要求您为链表中的每个元素a.k.a.节点指定显式名称。这也意味着当你放弃名字的范围时它不会被摧毁。当然,当您不再需要该列表时,您将需要在以后释放所有节点
那么你不需要指向节点中指针的指针,一个简单的指针就足够了。在主程序中,您还应该使用适当的指针。即使所有指针都是相同的尺寸并且可以相互投射,你应该 - 尽可能 - 使用正确的类型。
在这里,我在一个循环中创建了另外5个节点,以演示这种方法的灵活性如何。
如果你想做一个循环链表,那也很容易。只需添加以下这些内容:
next->next = current;