- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要实现两个功能
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/
我是一名优秀的程序员,十分优秀!