重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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行ずつ入れていっています。

A 回答 (1件)

実行環境があれば、最低限コンパイラ位は通して欲しいのですが、


まず、
> struct number *next;
> struct number *prev;
は、
struct num *next;
struct num *prev;
ですね.
それと、
> (*s)->ago = NULL;
は、
(*s)->prev = NULL;
ですね.
以上はコンパイラにかければチェックしてくれますから、記述ミスが分かります。

あと、処理上の便宜のため、Numリストの先頭と末尾を保存する構造体を定義し、
typedef struct numedge {
  Num *head;
  Num *tail;
} NumEdge;

static NumEdge num_edge = {(Num *)NULL, (Num *)NULL};
として、

/* リストの先頭を設定 */
Num *set_num_head(Num *p)
{
  if (p != NULL) {
    num_edge.head = p;
  }
  return p;
}

/* リストの末尾を設定 */
Num *set_num_tail(Num *p)
{
  if (p != NULL) {
    num_edge.tail = p;
  }
  return p;
}

/* リストの先頭を取得 */
Num *get_num_head(void)
{
  return num_edge.head;
}

/* リストの末尾を取得 */
Num *get_num_tail(void)
{
  return num_edge.tail;
}

/* 1個のリストの追加 */
void aplist(Num **s,char ns[]){
  Num *old, *new;
  if(*s == NULL){
    *s = (Num *)malloc(sizeof(Num));
    strcpy((*s)->rv,ns);
    (*s)->next = NULL;
    (*s)->prev = NULL;
    set_num_head(*s);
    set_num_tail(*s);
  } else {
    old = get_num_tail();
    new = (Num *)malloc(sizeof(Num));
    strcpy(new->rv,ns);
    new->next = NULL;
    old->next = new;
    new->prev = old;
    set_num_tail(new);
  }
  return;
}

と言う感じにしますね.

> このリストを逆方向(prevの方向)に表示していきたいのですが
は、

/* 1個のリストを出力 */
void print_a_list(Num *p)
{
  if (p != NULL) {
    printf("'%s'\n", p->rv);
  }
  return;
}

/* 全部のリストを逆順に出力 */
void print_all_list_rev(void)
{
  Num *p;
  if ((p = get_num_tail()) != NULL) {
    printf("print all list reverse:\n");
    do {
      print_a_list(p);
    } while ((p = p->prev) != NULL);
    printf("done.\n");
  }
  return;
}

で、任意の場所から、
print_all_list_rev();
すれば良いかと。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!