• ベストアンサー

関数テンプレート(構造体付き)

初歩的なことだと思うのですが、、 構造体の中の型に汎用性をもたせたいのですが、 template <typename DATA> struct cell { DATA data; DATA *next; }; cell<DATA> *insert(DATA x, cell<DATA> *init ) { cell<DATA> *p; r =new cell<DATA>; このような形かなと思ったのですが、エラーがかなりでます。 リストのプログラムで、挿入されるデータに汎用性をもたせたいのです。 お願いします。

noname#6448
noname#6448

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

template<typename DATA> struct cell { ... }; template<typename DATA> は 構造体/関数 の双方に必要です。 # 参考書を読んでいますか?

noname#6448
質問者

お礼

何度もありがとうございました。 おかげさまでできました。 参考書に構造体も使った例がなかったもので、悩んでいました。 御手数おかけいたしました。

その他の回答 (2)

回答No.2

template<typename DATA> cell<DATA> *insert(DATA x, cell<DATA> *init ) { ... } ではなくて?

noname#6448
質問者

補足

度々ありがとうございます。 struct cell { DATA data; DATA *next; }; template<typename DATA> cell<DATA> *insert(DATA x, cell<DATA> *init ) { cell<DATA> *p; このような形でしょうか? これだと構造体のDATAが宣言されていない、というエラーがでてしまいす(;。;) 構造体なしでテンプレートを使うのならできるのですが、構造体が混ざると混乱してしまいます。

回答No.1

リストをわざわざ自作せずとも、 双方向リスト: std::list<DATA> が用意されています。

noname#6448
質問者

補足

STLを使えばたしかにリストは使えるのですが、 テンプレートの勉強中なのです^^;;

関連するQ&A

  • 構造体について

    typedef struct num{ char rv[1000]; struct number *next; struct number *prev; }Num; このような双方向のリスト構造に void aplist(Num **s,char ns[]){ Num *old, *new; if(*s==NULL){ *s = (Num *)malloc(sizeof(Num)*1); strcpy((*s)->rv,ns); (*s)->next = NULL; (*s)->ago = NULL; return;} old= (*s); while(old->next != NULL){ old = old->next;} new = (Num *)malloc(sizeof(Num)*1); strcpy(new->rv,ns); new->next = NULL; old->next = new; new->prev = old; 関数の中でこのようにnext,oldを指定していったのですが、これでよいでしょうか?また、このリストを逆方向(prevの方向)に表示していきたいのですがどのように書けばよいでしょうか?nsは1行の文字列で、各構造体に1行ずつ入れていっています。

  • パスを含むファイルリストを表示する際、 ASCIIコード順になるように

    パスを含むファイルリストを表示する際、 ASCIIコード順になるようにソートして表示するようにするプログラムを作っているのですが、リストの仕組がいまいちよくわからず、うまくソートできません。 /* insert_dirent_cell(): セルをリストの先頭に追加する * 引数: head -- リストの先頭のセルへのポインタ * cell -- リストに加えたいセルへのポインタ * 戻り値: リストの先頭のセルへのポインタ */ struct dirent_cell *insert_dirent_cell(struct dirent_cell *head,struct dirent_cell *cell) { struct dirent_cell *ins_buf; //最初に挿入 if(head == NULL) { head = cell; return cell; } //先頭に挿入 if(strcmp(head->name, cell->name) > 0) { cell->next = head; head->next = cell->next->next; return cell; } //途中に挿入 ins_buf = head; while(ins_buf->next != NULL) { if(strcmp(ins_buf->next->name, cell->name) > 0) { cell->next = ins_buf->next; ins_buf->next->next = cell->next->next; return cell; } ins_buf = ins_buf->next; } //最後に挿入 ins_buf->next = NULL; cell->next = ins_buf; return cell; }

  • 線形リストに挿入するプログラム

    連結リストに要素を挿入する関数 insert( ) を関数を定義して,以下の条件の下で整数型の要素を連結リストに挿入するプログラムを作成しなければならないのですが、関数insert部分が見当がつきません. 回答よろしくおねがいします。 条件 1. 関数名を insert( ) とする. 2. 連結リストの先頭ノードを指すポインタ(*head)と,リストに挿入する要素(data)を引数とする. 3. 連結リストの先頭ノードを指すポインタ(*head)からたどって,要素がリスト内で降順(大きいものから小さいものへの順)となる位置に要素を挿入する. 4. 引数で示された要素が既にリストに存在する場合には,要素の挿入は行なわない. #include <stdio.h> #include <stdlib.h> typedef struct __cell { int data; struct __cell *next; } CELL; CELL *insert(CELL *head, int data); void showList(CELL *head); int main(void) { CELL *head; head = NULL; head = insert(head, 5); showList(head); head = insert(head, 2); showList(head); head = insert(head, 6); showList(head); head = insert(head, 4); showList(head); head = insert(head, 6); showList(head); head = insert(head, 4); showList(head); head = insert(head, 1); showList(head); return 0; } CELL *insert(CELL *head, int data) { /*ここで関数 insert( ) を定義します*/ } void showList(CELL *head) { CELL *p; for(p=head ; p!=NULL ; p=(*p).next) { printf("%d -> ", (*p).data); } printf("fin\n"); }

  • 構造体について

    以下のような構造体の宣言が合ったとき struct list { int a; char b[20]; struct list *next; }; struct list *add_list( int a, char *str, struct list *head );・・・1 struct list *del_list( int a, struct list *head );・・・2 1は引数の数が同じため問題ないのですが、2はどういう意味になるのでしょう?

  • テンプレート仮想関数のようなもの

    仮想関数をテンプレートにできないのは仕様と理解しているのですが、多少複雑になっても、それぞれの型に対するメンバ関数をいちいち記述していくことを回避するようなテクニックはありませんか? struct HOGE{ //template<typename T> //virtual operator T() = 0; //上記ができないので以下を全て記入していかなければならない virtual operator int() = 0; virtual operator short() = 0; //... }; struct HOGE1 : HOGE{ //template<typename T> //operator T() overtride{return T();} //上記ができないので以下を全て記入していかなければならない operator int(){return 0;} operator short(){return 0;} //... };

  • 双方向リストのバブルソートについて

    双方向リストをバブルソートを用いてソートしたいです。 下記がプログラム(一部)ですが、ソートした後にリスト表示すると 無限ループに陥ります。 どこがいけないのでしょうか。 #include <stdio.h> #include <stdlib.h> struct cell{ int data; struct cell *next, *prev; }; void insert_head(struct cell **head, int num){ struct cell *p, *p1; p = *head; p1 = make_cell(); *head = p1; p1->data = num; p1->next = p; if(p1->next != (struct cell *)NULL){ p1->next = p; p->prev = p1; } } void print_list(struct cell *head){ struct cell *p; p = head; printf("data = \n"); while(p != (struct cell *)NULL){ printf("%d\n", p->data); p = p->next; } } void sort_list(struct cell **head){ struct cell *p, *p2; int i, n; n = 0; p = *head; while(p->next != (struct cell *)NULL){ p = p->next; n++; } for(i = 0, p = *head; i < n-2; i++){ if(p->data > p->next->data){ if(p == *head){ *head = p->next; }else{ p->prev->next = p->next; } p2 = p->next; p->next = p->next->next; p->next->next = p; p->next->next->prev = p; p->next->prev = p->prev; p->prev = p2; }else p = p->next; } } int main(void){ struct cell *head = (struct cell *)NULL; int n; while(1){ printf("1:Insert head 2:Insert tail 3:Delete 4:List 5:Sort 6:Exit\n"); scanf("%d", &n); switch(n){ case 1: printf("num = "); scanf("%d", &n); insert_head(&head, n); break; case 2: printf("num = "); scanf("%d", &n); insert_tail(&head, n); break; case 3: printf("num = "); scanf("%d", &n); delete_cell(&head, n); break; case 4: print_list(head); break; case 5: sort_list(&head); break; case 6: return 0; break; } } }

  • 構造体について

    構造体について分からない点があり,教えて頂きたく投稿いたします. 現在,以下のような構造体を作成しています. typedef struct{ int data; struct node *NEXT; }node; また,それを管理するためのリストを以下の構造体にて宣言しました. typedef struct{ node *crnt; node *last; }node_list; また,使用する関数内での宣言は以下の通りです. node_list *non_dscvr_node_list; //未探査ノードを格納する node *crt_dscvr_node; //現在探査中のノードを示す node *start; そして, start->data = 10; start->NEXT = NULL; non_dscvr_node_list->crnt = start; non_dscvr_node_list->last = start; : : crt_dscvr_node = non_dscvr_node_list->crnt; non_dscvr_node_list->crnt = crt_dscvr_node->NEXT; //ここでエラーがでる. エラーの詳細は以下の通りです. warning: assignment from incompatible pointer type 私としては,リストに格納されている先頭ノードをポップして,次のノードを先頭にしたつもりだったのですが,ポインタタイプに互換性がないと怒られてしまいました. 少し調べては見ましたが,nodeの構造体を管理するために別に構造体を定義しているページがあまり見あたりません. 従って,そのようなページがあれば教えて頂きたいと思います. このような方法はあまりよくないのでしょうか. 併せて教えていただけますようお願いいたします.

  • C言語の構造体についてなんですが。

    struct LIST {     struct Num* number;     struct LIST* next;/* 次の要素へのポインタ */ }*root; struct Num{     int a;     struct Num* next; /* 次の要素へのポインタ */ }*numroot; と構造体を定義したときに、 main(){     struct LIST *p;     for(p = root; p != NULL; p = p->next) ; } とすれば、pの先頭からNULLまでを参照していくことは分かるんですが、pのnumberの先頭からNULLまでの参照方法(プログラムのfor文の記述方法)がイマイチわかりません。つまり、構造体の構造体をどのように参照するかということです。 これを実現したい理由は、構造体内での数の格納を配列(固定長)ではなく可変長で格納したいからです。 分かる方は解答をお願いします。

  • 構造体のポインタにNULLが入らない

    typedef struct tag{ int number; char name[10]; struct tag *next; }DATA; という構造体があって、 DATA *p; と宣言し、 p->next == NULL; とすることはできないんですか? セグメンテーション違反になってしまうのですが。 pが指すnextにNULLを入れるにはどうしたらいいのでしょうか?

  • C言語 アロー演算子について質問です。

    こんにちわ C言語初心者です。 C言語の教科書を見ていたら 双方向リストへの挿入というところで struct CELL{ struct CELL *prev; struct CELL *next; int value; } x->prev=p; x->next=p->next; p->next->prev=x; p->next=x; という記述がありました。 質問はこの部分で p->next->prev=x; アロー演算子が2個つくとどうなるんですか? 出来ればこの双方向リストの例でたとえてもらえるとうれしいです。 よろしくお願いします。

専門家に質問してみよう