gpt4 book ai didi

c - 从填充函数传递指针到链表不起作用

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

我正在闲逛指针和结构。我想实现以下目标:(1)用结构体(numberRecord)定义一个链表(2) 编写一个函数,通过循环(fillList)用一些样本记录填充链表(3) 统计链表中元素的个数(4)打印元素个数

到目前为止,我认为 fillList 函数运行良好,但我没有成功地将填充的链表移交给 main() 中的指针。在下面的代码中,printList 函数仅显示在 main() 中添加的单个记录,而不显示在函数 fillList 中创建的列表。

<小时/>
#include <stdio.h>
#include <stdlib.h>

typedef struct numberRecord numberRecord;

//linked list
struct numberRecord {
int number;
struct numberRecord *next;
};

//count #records in linked list
int countList(struct numberRecord *record) {

struct numberRecord *index = record;
int i = 0;

if (record == NULL)
return i;

while (index->next != NULL) {
++i;
index = index->next;
}

return i + 1;
}

//print linked list
void printList (struct numberRecord *record) {

struct numberRecord *index = record;

if (index == NULL)
printf("List is empty \n");

while (index != NULL) {

printf("%i \n", index->number);
index = index->next;
}

}

//fill the linked list with some sample records
void fillList(numberRecord *record) {

numberRecord *first, *prev, *new, *buffer;

//as soon as you add more records you get an memory error, static construction
new = (numberRecord *)malloc(100 * sizeof(numberRecord));
new->number = 0;
new->next = NULL;

first = new;
prev = new;
buffer = new;

int i;

for (i = 1; i < 11; i++) {

new++;

new->number = i;
new->next = NULL;

prev->next = new;
prev = prev->next;
}

record = first;
}


int main(void) {

numberRecord *list;
list = malloc(sizeof(numberRecord));
list->number = 1;
list->next = NULL;

fillList(list);
printf("ListCount: %i \n", countList(list));
printList(list);
return 0;
}

解决方案请阅读下面的帖子,他们指出了这个解决方案,并包含一些关于指针的非常有见地的评论。下面是有效的改编代码:

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

typedef struct numberRecord numberRecord;

//linked list
struct numberRecord {
int number;
struct numberRecord *next;
};

//count #records in linked list
int countList(struct numberRecord *record) {

struct numberRecord *index = record;
int i = 0;

if (record == NULL)
return i;

while (index->next != NULL) {
++i;
index = index->next;
}

return i + 1;
}

//print linked list
void printList (struct numberRecord *record) {

struct numberRecord *index = record;

if (index == NULL)
printf("List is empty \n");

while (index != NULL) {

printf("%i \n", index->number);
index = index->next;
}

}

//fill the linked list with some sample records
numberRecord *fillList() {

numberRecord *firstRec, *prevRec, *newRec;

int i;

for (i = 1; i < 11; i++) {

newRec = malloc(sizeof(numberRecord));
newRec->number = i;
newRec->next = NULL;

//initialize firstRec and prevRec with newRec, firstRec remains head
if (i == 1) {
firstRec = newRec;
prevRec = newRec;
}
prevRec->next = newRec;
prevRec = prevRec->next;
}

return firstRec;
}


int main(void) {

numberRecord *list;
list = fillList();

printf("ListCount: %i \n", countList(list));
printList(list);
return 0;
}

最佳答案

fillList中的这条语句

record = first;

main 中的 list 变量没有影响。在C 中,指针是按值传递的(与其他所有内容一样)。如果您想更新 main 中的 list 变量,则必须向其传递一个指针 (&list) 并修改 fillList 相应地,或者从 fillList 返回一个 numberRecord*。 (我实际上会选择第二个选项。)

这是一个(糟糕的)插图:

main调用fillList时,在该函数的起始点,指针如下所示:

main        memory       fillList
list ----> 0x01234 <---- record

稍后在 fillList 中,为 new 分配一些存储空间(这实际上是一个坏名字,它与 C++ 中的运算符冲突,会让人们感到困惑)

main        memory       fillList
list ----> 0x01234 <---- record
0x03123 <---- new

fillList 的最后一行,您剩下:

main        memory       fillList
list ----> 0x01234 ,-- record
0x03123 <---- new

recordlist 不是同一个变量。它们一开始具有相同的值,但更改 record 不会更改 list。事实上,它们都是指针,在这方面与 int 没有任何不同。

您可以更改fillList中列表指向的内容,但无法更改list指向 (使用您的代码版本)。

解决这个问题的最简单方法是像这样更改 fillList:

numberRecord *fillList() {
....
return new;
}

并且在main中,不要直接分配list,只需调用fillList()来初始化它。

关于c - 从填充函数传递指针到链表不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829262/

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