gpt4 book ai didi

c - 链接列表添加功能未按预期工作

转载 作者:行者123 更新时间:2023-11-30 20:11:57 25 4
gpt4 key购买 nike

我正在学习 C 语言的数据结构并考虑实现相同的,下面是代码及其给出的奇怪输出,在添加记录函数中显示时显示正确的数据,但是当从主函数调用相同的函数时,值会发生变化,我知道它与按值调用有关,但无法弄清楚确切的数据原因。

PS:抱歉,如果程序太长或不符合标准

#include <stdio.h>
#include <stdlib.h>

struct record;
typedef struct record data_record;

struct record{
int data;
struct record *next_record;
};

// forward function declarations
data_record *get_record();
void initialize_record(data_record *,int);
void display_record(data_record *);
void display_list(data_record *,int);
data_record *generate_link_list(data_record *,int);
void add_record(data_record *,data_record,int);

int main(int argc,char *argv[])
{
printf("Initializing the data ... \n");
printf("Data length: %d \n",sizeof(data_record));
int array_length = 5;

data_record *start;
// generate_list function
start = generate_link_list(start,array_length);
printf("------------------------------------\n\n");
display_list(start,array_length);
printf("Address : %x \n",start);

// add the extra item to the existing list
data_record record;
record.data = 100;
record.next_record = NULL;
add_record(start,record,2);
display_list(start,array_length +1);

printf("Terminating the program \n");
return 0;
}

data_record *get_record()
{
return (data_record *)malloc(sizeof(data_record));
}

void initialize_record(data_record *record,int data)
{
record->data = data;
record->next_record = NULL;
}

void display_record(data_record *record)
{
printf("Printing data: \t");
printf("Data: %d \t",record->data);
printf("Next Item address: %x \n",record->next_record);
}

void display_list(data_record *list,int length)
{
data_record *list_pointer = list;
printf("Printing the list: \n");
int index;
for(index = 0;index < length;index++)
{
display_record(list_pointer);
list_pointer = list_pointer->next_record;
}
printf("Done with the printing \n");
}

data_record *generate_link_list(data_record *list,int array_length)
{
list = get_record();
initialize_record(list,0);
data_record *current_record_pointer, *record;
int index = 0;

current_record_pointer = list;

printf("First record: ");
display_record(current_record_pointer);

for(index = 1;index < array_length;index ++)
{
record = get_record();
initialize_record(record,index);
current_record_pointer->next_record = record;
current_record_pointer = record;
}
return list;
}

void add_record(data_record *list,data_record record,int position)
{
printf("Start address %x \n",list);
printf("New record address %x \n",&record);
data_record *list_pointer = list;
int list_position = 0;
for(list_position = 0;list_position < position - 1;list_position ++)
{
list_pointer = list_pointer->next_record;
}
if(list_pointer != NULL)
{
data_record *next_record = list_pointer->next_record;
list_pointer->next_record = &record;
record.next_record = next_record;
}
display_list(list,6);
}

当从 add 函数调用时,display_list 显示正确,但在 add 函数之后从 main 调用时,显示值相同

最佳答案

问题在于传递给 add_recordrecordmainrecord 的副本。当参数是结构体时,这就是值传递的工作原理。因此,对 record 的更改只会影响副本,而不影响原始内容。

要解决此问题,请将 record 声明为指针

void add_record(data_record *list,data_record *record,int position)
{
...

list_pointer->next_record = record;
record->next_record = next_record;

...
}

并传递main中记录的地址

add_record(start,&record,2);
<小时/>

旁注:将 start 传递给 generate_link_list 是没有意义的,因为 start 不包含 generate_link_list< 的任何信息 需要或使用。因此将其更改为:

data_record *generate_link_list(int array_length)
{
data_record *list = get_record();

...
}
<小时/>

另一个注意事项:正如 @JonathanLeffler 在评论中指出的,您应该始终使用 get_record 函数来创建记录。我会更进一步说 get_recordinitialize_record 应该组合成一个函数 create_record,例如

data_record *create_record(int data)
{
data_record *record = malloc(sizeof(data_record));
if ( record )
{
record->data = data;
record->next_record = NULL;
}
}

那么main中的代码就变成了

// add the extra item to the existing list 
data_record *record = create_record(100);
if (record)
add_record(start,record,2);
display_list(start,array_length +1);

通过对列表中的所有记录使用create_record,您可以在需要时安全地释放列表中的项目。

关于c - 链接列表添加功能未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38413836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com