struct x{
...;
...;
struct x * next;
};
struct x create() {
struct x new = malloc...
new->... = .;
new->... = ..;
new->next = NULL
};
当我创建struct x的新节点时,在使用struct x create多次时它是如何工作的。您可以多次使用它,这对我来说很奇怪,因为它每次都将内存分配给具有相同名称的结构x?结构的每个节点都不需要单独的名称。或者每次进行新的内存分配时才重要。
主要问题:我将创建第一个节点,然后创建第二个节点。然后,第一个节点应指向第二个节点,依此类推。但是当我创建第一个节点时,第二个节点不存在,因此我无法设置第一个> next = second。
我查看了链接列表示例,但目前并没有改善我的想法。代码并不像我自己的理解和思考那么重要。请帮助我思考和掌握这个概念。
//我试图跟随Degustaf的消息(除了下一个指针,基本上与创建一个新节点相同)但是实现错误。所以我觉得这个代码有什么问题:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct x{
int a;
int b;
struct x * next;
}
struct x *create(int a , int b){
struct x *new = malloc(sizeof(struct x));
new->a = a;//namn skitsamma allokering relevant
new->b = b;
new->next = NULL;
return new;
};
int main() {
struct x *x1 = struct x *create(12,13);
return 0;
}
答案 0 :(得分:1)
您可以在创建指针后简单地指定指针的值。
即,
struct x x1 = create();
struct x x2 = create();
x1.next = &x2;
x2.next = &x1;
答案 1 :(得分:0)
我认为这是你想要的,但这是一个列表中带整数的例子,你可以根据需要改变代码。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <iostream>
struct cell {
float info;
struct cell * next;
};
int more (float * k)
{
char ans[4];
printf("Continue Yes/No: ");
scanf("%s",ans);
if (ans[0]=='Y') {
printf("insert value: ");
scanf("%f",k);
return(1);
}
else
return(0);
}
struct cell * crelist()
{
struct cell * last = (struct cell *)NULL;
struct cell * ptr = (struct cell *)NULL;
struct cell * list = (struct cell *)NULL;
float k;
ptr = (struct cell *)malloc(sizeof(struct cell));
if (ptr != (struct cell *)NULL) {
printf("insert value: ");
scanf("%f",&k);
ptr->info = k;
ptr->next = (struct cell *)NULL;
list = ptr;
last = ptr;
}
else
return((struct cell *)NULL);
while (more(&k)) {
ptr = (struct cell *)malloc(sizeof(struct cell));
if (ptr != (struct cell *)NULL) {
ptr->info = k;
ptr->next = (struct cell *)NULL;
last->next = ptr;
last = ptr;
}
else
break;
}
return(list);
}
void printlist(struct cell * list)
{
struct cell * p;
p = list;
while (p != (struct cell *)NULL) {
printf("->%f\n",(*p).info);
p=(*p).next;
}
return;
}
int main()
{
struct cell * list;
int i;
list = crelist();
printlist(list);
scanf("%d",&i);
system("pause");
return 0;
}
答案 2 :(得分:0)
或者每次新内存分配完成时才重要。
正确。
但是,您的代码还存在其他问题。特别是,您不能从create
函数返回任何内容。我看到有两种方法可以解决这个问题。首先,你可以直接返回结构,这意味着你不需要malloc:
struct x create()
{
struct x new;
new.member1 = .;
new.member2 = ..;
new.next = NULL;
return new;
};
然后您可以使用
填充它struct x x1 = create();
struct x x2 = create();
x1.next = &x2;
另一种可能性是返回指向结构的指针,在这种情况下,它变为
struct x *create()
{
struct x *new = malloc...;
new->member1 = .;
new->member2 = ..;
new->next = NULL;
return new;
};
然后您可以使用
填充它struct x *x1 = create();
x1->next = create();
我的观点是第二个选项更清晰,因为你不必担心链表的各个元素超出范围,尽管在释放内存时需要小心(需要遍历)列表和一次释放一个元素。