链表功能-C

时间:2018-11-02 15:11:44

标签: c

我正在尝试编写一个从数组中创建链接列表的函数:

typedef struct {
    char airplane_name[AIRPLANE_NAME_MAX_LENGTH];
    char airplane_model[MODEL_LENGTH];
    float age;
    struct plane *next_plane;
} plane;

int CreateAirplaneList(plane **plane_input_output) {
plane plane_name_arr[NUM_OF_PLANES] = { {"Beit-Shean", "737", 5}, {"Ashkelon", "737", 10.25}, {"Hedera", "737", 3}, 
{"Kineret", "737", 7.5},{"Naharia", "737", 1}, {"Tel-Aviv", "747", 20}, {"Haifa", "747", 15}, {"Jerusalem","747",17},
{"Ashdod", "787", 1}, {"Bat Yam","787", 1.5}, {"Rehovot", "787", 0.5} };

plane *new_plane = NULL, *list=NULL;

int i = 0;
for (i = 0; i < NUM_OF_PLANES;i++) {
    new_plane = (plane*)malloc(sizeof(plane));
    if (new_plane == NULL) {
        printf("Memory allocation failed\n");
        return FAILURE;
    };
    new_plane = &plane_name_arr[i];
    printf("name%d:%s\n", i, new_plane->airplane_name);
    new_plane->next_plane = list;
    list = new_plane;
    printf("new name%d:%s\n", i, list->airplane_name);
}
printf("all good");
*plane_input_output = list;
return SUCCESS;
};

main()作为参数在NULL上运行时,它卡住了。

int main(){
plane **x = NULL;
CreateAirplaneList(x);
return 0;
}

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

只需阅读代码并猜测应该执行的操作,我就会看到以下内容:

*new_plane = plane_name_arr[i];

上面的代码将数组中元素的地址写入new_plane并 丢弃刚刚分配的指针。您可能需要将值从plane_name_arr [i]复制到新内存。

*plane_input_output = list;

您提到您从main调用NULL的方法。当您在方法末尾写入该内存时,此方法也不起作用。

int main(int argc, char *argv[]) {
  plane *head = NULL;
  CreateAirplaneList(&head);
}

这需要有一些可以写入的内存。

这样称呼:

int CreateAirplaneList(plane **plane_input_output)

确保 CreateAirplaneList 末尾的写操作实际上可以将结果写在某个位置。

您的方法plane **x = NULL; CreateAirplaneList(x); 将指向指针的指针作为参数。 如果您像使用以下方法那样调用它:

plane *head;

您将传入值NULL。这意味着最后的写入尝试写入NULL。由于要在方法之外传递链接列表,因此要为该方法提供一个可以写入结果的地址。

因此,您将创建所需类型的变量。在这种情况下,CreateAirplaneList(&head)然后将该变量的地址传递给方法*plane_input_output = list,以便在head写入时将其写入{{1 }}。

在快速查看它的过程中,可能还有更多我未曾发现的错误。祝你好运。

答案 1 :(得分:2)

使用:

new_plane = (plane*)malloc(sizeof(plane));

您正在为飞机分配空间。然后加上:

new_plane = &plane_name_arr[i];

您扔掉内存,并用指针替换到planes数组中。可能您打算这样做:

*new_plane = plane_name_arr[i];

它将平面数据从阵列复制到分配的内存中。

(在您的版本中,该数组是一个本地数组,即在堆栈上,在函数返回后不再存在。其内存将被重用,并且您的链接列表显示为垃圾。)

在您的main中,必须使用列表头的地址调用该函数:

  plane *x = NULL;         //  x is the list
  CreateAirplaneList(&x);  // &x is the address of the list

创建功能现在可以修改x中的列表。