gpt4 book ai didi

c - 附加和读取链接列表的函数

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

我正在开发一个小型测试程序,它可以在链接列表上执行 2 个功能:

  1. 将某些内容附加到链接列表中。
  2. 获取附加的内容。

所以我编写了两个可以完全执行此操作的函数。然而它不起作用。如果我调用函数 append_work() ,它会打印出它附加了工作以及我传递的正确值。然而之后它似乎没有正确设置指向下一个结构的指针。我不知道为什么会发生这种情况。

当我调用 get_work() 时,会发生类似的事情,它会正确打印出当前工作,但不会将其设置为下一个工作。 outptr 在那里只是为了返回要完成的工作的结构,同时仍然将 work_travel 设置为下一个!

我可能错过了一些非常明显的指针,但我没有看到它......

这是代码。它编译:

#define          _POSIX_C_SOURCE                             200809L  
#define ERRNO_BUFSIZE 256

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

int strerror_r(int errnum, char *buf, size_t buflen);

typedef struct work work;

struct work {

char *str;
int i;
work *next;

};

int append_work(work *ptr, char *work, int i) {
char strerror_buf[ERRNO_BUFSIZE];

ptr->next = malloc(sizeof(work));
if (ptr == NULL) {
strerror_r(errno, strerror_buf, ERRNO_BUFSIZE);
printf("malloc() err: %s\n",strerror_buf);
return -1;
}

ptr = ptr->next;
ptr->str=work;
ptr->i=i;
printf("appending work: %s\n",ptr->str);

ptr->next = NULL;

return 0;

}

int get_work(work *inptr, work *outptr) {

if (inptr == NULL) {
printf(" No work found...\n");
return -1;
} else {
outptr = inptr;
printf(" work found: str: %s|| int: %d\n",inptr->str, inptr->i);
inptr = inptr->next;
return 0;
}
}



int main() {

char strerror_buf[ERRNO_BUFSIZE];

work *root;
work *work_travel;
work *add_work;
work *curr_work;

root = malloc(sizeof(work));
if (root == NULL) {
strerror_r(errno, strerror_buf, ERRNO_BUFSIZE);
printf("malloc() err: %s\n",strerror_buf);
exit(1);
}
root->str="work 0";
root->i=0;


work_travel = root;
add_work = root;

append_work(add_work, "work 1", 1);
append_work(add_work, "work 2", 2);
append_work(add_work, "work 3", 3);
append_work(add_work, "work 4", 4);
append_work(add_work, "work 5", 5);
append_work(add_work, "work 6", 6);
append_work(add_work, "work 7", 7);
append_work(add_work, "work 8", 8);
append_work(add_work, "work 9", 9);

get_work(work_travel, curr_work);
get_work(work_travel, curr_work);
get_work(work_travel, curr_work);

exit(1);

}

最佳答案

您永远不会返回列表的新头,您正在更改 append_work() 内的 ptr ,但更改了 add_work 的值main() 没有改变。

您应该返回新的列表头。

这是因为 C 严格来说是 call by value ;参数是调用者上下文中相同值的副本,更改副本不会影响调用者的值。值的类型并不重要,它始终是一个副本。

关于c - 附加和读取链接列表的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24452803/

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