• 締切済み

リストを操作する関数ref,add,delについて

リストを、長さが動的に変化する配列のデータ型とみなし以下の関数を作成せよ。 1、リスト中の要素を参照する関数refは(ref l n)の形式である。ここに、lは参照するリストである。nは整数値であり、l中の参照する要素の位置を示す。 2、リストに要素を追加する関数addは(add e l n)の形式である。ここに、eは追加する要素、lはeを追加するリスト、nは整数値であり、lのn番目の要素の直前にeを追加することを意味する。 3、リストから要素を削除する関数delは(del l n)の形式である。ここに、lはリストである。nは整数値であり、lのn番目の要素を削除することを意味する。 Lispで作成しなければなりません。 どのようにプログラム組めばよいのかわかりません。教えてください。

みんなの回答

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.2

すぐに回答がほしい質問で2週間以上たっているので遅すぎるかもしれませんが・・・ このような質問の場合、背景がわからないと適切な答は返せないと思います。 おそらく再帰を使ったリスト処理で答えるところかとは思いますが、ほかにもたとえばLispの文法や実用的なプログラムの書き方を覚えるためという可能性もないとは言えませんし・・・

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

プログラムの組み方は出してもいいけど, アルゴリズムは考えてね.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リスト構造

    リスト構造を用いてheadと整数x(int型)を引数にとって、 リスト中のn番目にxが存在していればnを返して、そうでなければ -1を返すような関数を作りたいんですけど教えてください。

  • c言語 片方向連結リスト

    c言語の片方向連結リストのプログラムについて質問があります. 下記のプログラムの関数int get_index(ListPtr l, int value)に以下のようなコードを書く.リストl において値value を持つセルの位置を返す.返り値は,最初のセルが値value を持っていれば0,次のセルが値value を持っていれば1,...,値value を持っているセルが存在しなければ–1とする. また,関数void add(ListPtr l, int index, int value)に以下のようなコードを書く.リストl の位置index に値value を持つセルを挿入.挿入前のリストに対して:index が0 のときは先頭に挿入,index が1 のときは(0から数えて)1番目のセルの前に挿入,index が2 のときは(0から数えて)2番目のセルの前に挿入,...,index がリストのサイズと等しいときはリストの末尾に挿入,それ以外の場合は何もしなくてよい. これらのコードはどのように書けばよいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <assert.h> /* 連結リスト中のノードの構造体 */ struct node { int val; /* 値 */ struct node *next; /* 次ノード */ }; /* セルとそのポインタの型 */ typedef struct node Node; typedef Node *NodePtr; /* セルを一つ生成 */ NodePtr create_node(int v) { NodePtr n = NULL; n = malloc(sizeof(Node)); n->val = v; n->next = NULL; return n; } /* セルを表示 */ void print_node(NodePtr n) { if (n != NULL) { printf("<%d>", n->val); } else { printf("(null)"); } } /* 連結リストの構造体 */ struct list { /* 先頭セルへのポインタ */ NodePtr head; }; /* 連結リストとそのポインタの型 */ typedef struct list List; typedef List *ListPtr; /* 空の連結リストを生成 */ ListPtr create_list(void) { ListPtr l = NULL; l = malloc(sizeof(List)); l->head = NULL; return l; } /* 連結リスト l が空かどうか判定 */ int is_empty(ListPtr l) { return (l->head == NULL); } /* リスト l の内容を表示 */ void print_list(ListPtr l) { NodePtr n = NULL; if (is_empty(l)) { printf("(empty)\n"); return; } n = l->head; while (n != NULL) { print_node(n); n = n->next; } printf("\n"); } /* リスト l の先頭にセルを挿入 */ void add_first(ListPtr l, int val) { NodePtr n = NULL; n = create_node(val); n->next = l->head; l->head = n; } /* リスト l の先頭セルを削除 */ int delete_first(ListPtr l) { NodePtr n = NULL; int v; /* リストが空なら -1 を返す(負の値はリストに含まれないと仮定)*/ if (is_empty(l)) return -1; v = l->head->val; n = l->head; l->head = l->head->next; free(n); n = NULL; return v; } /* 連結リスト l のサイズを取得 */ int get_list_size(ListPtr l) { NodePtr n = NULL; int size; size = 0; n = l->head; while (n != NULL) { size++; n = n->next; } return size; } /* * 連結リスト l における index 番目のセルの値を取得 * (そのようなセルが存在しなければ -1 を返す) */ int get_value(ListPtr l, int index) { NodePtr n = NULL; if (index < 0) return -1; n = l->head; while (index > 0 && n != NULL) { n = n->next; index--; } return (n == NULL) ? -1 : n->val; } /* リスト l 中の全セルを削除(ループ版)*/ void delete_all(ListPtr l) { NodePtr n = NULL, m = NULL; n = l->head; while (n != NULL) { m = n; n = n->next; free(m); } l->head = NULL; } /* セル n 以降を全て削除(内部処理用の再帰関数)*/ void delete_rest(NodePtr n) { if (n->next != NULL) delete_rest(n->next); free(n); } /* リスト l 中の全セルを削除(再帰版)*/ void delete_all_recursively(ListPtr l) { if (l->head == NULL) return; delete_rest(l->head); l->head = NULL; } /* リスト l 全体を削除 */ #define delete_list(l) (delete_list0(l),l=NULL) void delete_list0(ListPtr l) { delete_all(l); free(l); } /* リスト l において値 val を持つセルの位置を返す */ int get_index(ListPtr l, int value) { return -1; } /* リスト l の位置 index に値 val を持つセルを挿入 */ void add(ListPtr l, int index, int value) { } /* 連結リストの使用例 */ int main(void) { FILE *fp = NULL; char buf[10]; int age; ListPtr l = NULL; l = create_list(); add_first(l, 28); add_first(l, 40); add_first(l, 33); add_first(l, 15); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); return 0; }

  • Prologについて

    リストの末尾への要素に追加するプログラムを教えてください。 第2引数のリストの末尾へ、第1引数が加えられたリストが第3引数として得られるようなプログラムで、次のように動作すればいいです。 ?-add_last(e,[a,b,c,d],L). [[Enter]] L = [a, b, c, d, e] ; [[Enter]] No ?-add_last(X,L,[a,b,c,d,e]). [[Enter]] X = e L = [a, b, c, d] ; [[Enter]]

  • Lispでリストの中身もすべて反転する関数

    リストの中身をもすべて反転する関数を作っているのですが、 reverse関数を自分で実装はできたのですが、上記のような使用を持つ関数を作れません。どうぞどのようにしたらよいか教えていただけないでしょうか? ちなみに自分で作ったreverseはこれです。 (defun my-reverse (n) (if (null n) nil (append (my-reverse (cdr n)) (list (car n))))) 作りたい関数では以下のようになります。 (make-reverse '(a (b (c d))(e (f g)))) (((g f) e)((d c) b) a)

  • C言語 配列・関数の問題

    下記の問題が解けなくて困っております。 for文をつかった解法をお願いしたいです。 n個の要素からなる整数の配列a[ ]の中から2番目に大きな値を求め、それを戻り値とする関数maxsecを作成しなさい。 int maxsec(int n , int a[ ]) { 宜しくお願いします。

  • StandardMLで整数リストの奇数・偶数番目の要素の和を組として返したい

    StandardMLで整数リストの奇数・偶数番目の要素の和を組として返す関数sumを作りたい。 sum:int list->int*int。sum([1,2,3,4])ならば(4,6)となるような関数。 自分で途中までは考えてみました。 fun sum(nil)=nil | sum(x::xs::xxs)= どのように条件分岐などをすればよいかが分かりません。 ご指導よろしくお願いします。

  • 関数の意味

    =INT(F13/TIME(1,0,0)*((B4+E4+N4(/22/7*1.3))の関数の意味。F13には0:00:00のデータ。B4,E4,N4は整数です。F13の0:00:00の意味も教えて

  • LISPのプログラミングについて

    リストと数nを引数として、リストの(n-1)番目の要素を返す関数を 再帰を使って定義するにはどうすればいいでしょうか?

  • Listに格納されているオブジェクトの照合(パターンマッチング?)

    2つのListオブジェクトを比較して、 それぞれの要素に格納されているクラスの属性が 一致しているかどうか、また、格納されている順番が同じかどうかを 調べたいのですが・・。 例えば、以下のようなかんじです↓ 1. 比較するListオブジェクト(1):userList //Userオブジェクト生成 User user1 = new User(); user1.setUserID(2); User user2 = new User(); user2.setUserID(4); //UserオブジェクトをListに格納 List userList = new ArrayList(); userList.add(user1); userList.add(user2); 2. 比較するListオブジェクト(2):specialUserList ※1.と同じ要領で生成されたもの List specialUserList; 3. 1と2を比較する 比較内容は以下の通りです。 1のListオブジェクト(userList)は、 1番目の要素に、 UserID:2 を持つUserオブジェクト 2番目の要素 に、UserID:4 を持つUserオブジェクト が格納されていますが、 2のListオブジェクト(specialUserList)も、 これと同じ構成で格納されているかどうか調べたいのです。 例えば、 2のListオブジェクトも、 1番目の要素に、 UserID:2 を持つUserオブジェクト 2番目の要素 に、UserID:4 を持つUserオブジェクト が格納されていればOKとし、上記以外であれば、NGとします。 例えば、以下のような内容がNGです。 1番目の要素に、 UserID:1(※2以外) を持つUserオブジェクト 2番目の要素 に、UserID:8(※4以外)を持つUserオブジェクト つまり、List要素に格納されている内容と、その格納されている順番が、 1と2で同じかどうかを調べたいのです。 もし分かる方いましたら、お力をお貸しください・・・

    • ベストアンサー
    • Java
  • INDIRECT関数の使い方について

     この関数は間接的にセルの参照をするというのは分かるのですが、 数式入力パレットの『参照文字列』の下の『参照形式』があり、論理とか可変と表示されます。  理屈は『こうなんだなぁ』と思い、入力しますと『REF!』のエラーが表示されます。  参照形式の欄にA1とかR1C1とか指定するのでしょうか?この辺が整理できず、ヘルプを見ていますが、理解できていません。  VLOOKUP+INDIRECTの参照セル名前の切替、範囲の切替は分かっているのですが、単純な単独使用で混乱しています。  どなたか教えて下さい。