gpt4 book ai didi

c - 如何在C中返回列表中的节点

转载 作者:行者123 更新时间:2023-11-30 16:56:40 27 4
gpt4 key购买 nike

我需要实现两个功能

directed_by(node_t * list, char *director)

评级(node_t * 列表,const rating_t 评级)

每个都需要我传入一个列表并迭代它。我是 C 新手,实际上我对列表结构也不太熟悉。有人可以帮我理解如何返回一个列表,以便我可以传递到我的两个函数中,以便我可以迭代每个列表吗?

这是到目前为止我的代码。我认为我需要在 add_movie() 函数中返回一些内容,例如 node_t,但我不知道该怎么做?

列表.H

#ifndef BASICLIST_H_
#define BASICLIST_H_

typedef struct node {
void * data; /* pointer to data */
struct node * next; /* pointer to next next node */
} node_t;

int list_add(node_t ** list, void * data);

#endif

电影.H

#include <stdio.h>
#ifndef MOVIE_H
#define MOVIE_H
#define SIZE_LIMIT 25
#define RATING_SIZE 6

typedef struct {
char title[SIZE_LIMIT];
char director[SIZE_LIMIT];
char rating[RATING_SIZE];
//rating_t rating;
int year;
}movie_t;


void get_movie(movie_t * movie);
void print_movie(const movie_t *m);
void print_movies(const movie_t *m);
void add_movie(movie_t movie);

#endif /* MOVIE_H */

列表.C

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

int list_add(node_t ** list, void * data) {
int ret = 0;
node_t * newnode = (node_t *) malloc(sizeof(node_t));
if (newnode == NULL) {
ret = -1;
}
else {
newnode->data = data;
newnode->next = *list;
}
*list = newnode;
return ret;
}

电影.C

#include <stdio.h>
#include <stdlib.h>
#include "movie.h"
#include "basiclist.h"

void print_movies(const movie_t *m) {
printf("%s\t%s\t%s\t%d\n", m->title, m->director, m->rating, m->year);
}

void add_movie(movie_t movie) {
node_t * list = NULL;
movie_t first_movie = movie;
movie_t * new_movie;
new_movie = malloc(sizeof (*new_movie));
*new_movie = first_movie;
list_add(&list, new_movie);
node_t * curr;
curr = list;
while (curr != NULL) {
print_movies(curr->data);
curr = curr->next;
}
}

MAIN.C

#include "movie.h"
#include <stdlib.h>
#include <stdio.h>
#include "basiclist.h"

int main(void) {
movie_t movie1 = {"Movie1", "Director1", "PG-13", 1900};
movie_t movie2 = {"Movie2", "Director2", "R", 1900};
movie_t movie3 = {"Movie3", "Director3", "G", 1900};
movie_t movie4 = {"Movie4", "Director4", "R", 1900};

add_movie(movie1);
add_movie(movie2);
add_movie(movie3);
add_movie(movie4);

/*undefined methods
directed_by(node_t * list, char * director)
rated(node_t * list, const rating_t rating)
*/
return 0;
}

最佳答案

此代码的主要问题是您没有返回列表或将列表传递给 add_movie 函数。

在每次调用中,您都会创建一个新列表并丢失它的引用,因此您无法使用它。

对代码的“简单”修复是更改:

void add_movie(movie_t movie)

void add_movie(node_t** list, movie_t movie);

并删除函数的第一行,然后将 main 更改为:

node_t* list = NULL;
add_movie(&list, movie1);
add_movie(&list, movie2);
add_movie(&list, movie3);
add_movie(&list, movie4);

通过此更改,您将获得包含 movie4、movie3、movie2 和 movie1 的列表。

PS:您还想更改列表添加方法以返回 -1,而不是将 ret 设置为 -1。在当前形式中,如果出现错误,您将丢失列表,因为您将给定引用设置为 NULL(同时,这会造成内存泄漏)。

PS 2:实际上不建议在 C 中将结构体作为参数传递,您应该使用指针。原因是,当您将结构体作为参数传递时,C 会将其全部内容复制到临时结构体变量中,因此,如果您有一个 256 字节的结构体,您将为每个函数调用复制 256 字节的信息,而不是 4 个字节。 (32 位系统)或 8(64 位系统)如果您使用了指针。

关于c - 如何在C中返回列表中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39858147/

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