创建指向彼此的新节点

时间:2014-10-16 16:52:41

标签: c pointers struct nodes

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;

}

3 个答案:

答案 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();

我的观点是第二个选项更清晰,因为你不必担心链表的各个元素超出范围,尽管在释放内存时需要小心(需要遍历)列表和一次释放一个元素。