私はポインタとメモリモデルにかなり慣れていないので、これが明らかな場合はすみませんが、リストを逆にする関数reverseをテストするプログラムを書いています。とにかく、C5.c、C5-driver.c、C5.hの3つのファイルにあります。ここにそれらはその順序であります:
#include "C5.h"
#include <stdlib.h>
#include <stdio.h>
struct node *cons(int fst, struct node *rst) {
struct node *new = malloc(sizeof(struct node));
if (new == NULL) {
printf("cons: out of memory\n");
abort();
}
(*new).first = fst; /* same as (*new).first = fst */
(*new).rest = rst;
return new;
}
struct node *reverse(struct node *lst) {
struct node *ans = NULL;
while (lst != NULL) {
ans = cons((*lst).first, ans);
lst = (*lst).rest;
}
return ans;
}
void free_list(struct node *lst) {
struct node *p;
while (lst != NULL) {
p = lst->rest;
free(lst);
lst = p;
}
}
void print_list(struct node *lst) {
printf("( ");
while (lst != NULL) {
printf("%d ", (*lst).first);
lst = (*lst).rest;
}
printf(")\n");
}
C5-driver.c
#include <stdlib.h> #include <stdio.h> #include "C5.h" int main() { struct node *lst1 = cons(5, NULL); struct node *lst2 = cons(3, lst1); struct node *lst3 = cons(1, lst2); print_list(lst3); lst3 = reverse(lst3); print_list(lst3); free_list(lst3); }
C5.h
struct node { int first; struct node *rest; }; struct node *cons(int ,struct node *); struct node *reverse(struct node *); void print_list(struct node *); void free_list(struct node *);
ただし、XCodeから、メモリリークがあると言われています。
consが使用された後だと思いますが、newstruct node *ans = new
とfree(new)を作成してみました。リターンans付き; しかし、それは機能しません。上記のように、free_listも試しました。
ありがとう〜