• 締切
  • すぐに回答を!

双方向リストで…、

  • 質問No.3218732
  • 閲覧数250
  • ありがとう数0
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 12% (8/62)

typedef struct score{
char name[40];
int eng;
int math;
int sci;
struct score *next;
struct score *prev;
} SCORE;
SCORE head;

/* 双方向リストに要素を追加する */
void add_list(void)
{
SCORE *p, *new;

in_file = fopen("input.txt", "r");
if ( in_file == NULL ){
printf("error: not open file.\n");
exit(0);
}


while( fgets(line, sizeof(line), in_file) != NULL ){

p = head.next; /* 先頭要素の次の要素のアドレス */

/* 新しく追加する要素のためのメモリ領域を確保する */
new = malloc( sizeof(SCORE) );
/* 新しい要素のデータを設定 */
sscanf(line, "%s %d %d %d", new->name, &new->eng, &new->math, &new->sci);
new->next = p->next; /* 新しい要素の次の要素へのアドレスを設定 */
new->prev = p; /* 新しい要素の前の要素へのアドレスを設定 */
p->next->prev = new; /* 新しい要素の直後の要素のprevに、新しい要素のアドレスを設定 */
p->next = new; /* 新しい要素の直前の要素のnextに、新しい要素のアドレスを設定 */
}
}


↑のところがうまくいきません。
何がだめか教えてください。

回答 (全2件)

  • 回答No.2
あちこち書き換えましたが、こんな感じでいかがでしょうか。

#include <stdio.h>
#include <stdlib.h>

const int LINE = 1024;

typedef struct score{
char name[40];
int eng;
int math;
int sci;
struct score *next;
struct score *prev;
} SCORE;


/* 双方向リストに要素を追加する */
void add_list(SCORE* head , SCORE* tail)
{
SCORE *p, *new;
char line[LINE];
FILE* in_file;

in_file = fopen("input.txt", "r");
if ( in_file == NULL ){
printf("error: not open file.\n");
exit(0);
}


while (fgets(line, sizeof(line), in_file) != NULL ){
/* p -> new -> tail の順で接続します */
p = tail->prev;
new = (SCORE*)malloc(sizeof(SCORE));
if(new == NULL)
{
printf("malloc failed.\n");
exit(1);
}
/*scanfでなく、sscanfを使います*/
sscanf(line , "%s %d %d %d" , new->name , &(new->eng) , &(new->math) , &(new->sci));
p->next = new;
new->prev = p;
new->next = tail;
tail->prev = new;
}
fclose(in_file);
}

/*リスト全体表示(確認用)*/
void print_list(SCORE* head , SCORE* tail)
{
SCORE* it = head->next;
while (it != tail)
{
printf("%s %d %d %d\n" , it->name , it->eng , it->math , it->sci);
it = it->next;
}
}

/*リスト要素全削除(head,tailは削除しない)*/
void all_free(SCORE* head , SCORE* tail)
{
SCORE* it = head->next;
while (it != tail)
{
SCORE* tmp = it->next;
free(it);
it = tmp;
}
}

int main(void)
{
/*双方向リストということで、head(先頭)とtail(末尾)を用いて管理します。*/
SCORE* head = (SCORE*)malloc(sizeof(SCORE));
SCORE* tail = (SCORE*)malloc(sizeof(SCORE));
if (head == NULL || tail == NULL)
{
printf("malloc failed.\n");
exit(1);
}
head->prev = NULL;
head->next = tail;
tail->prev = head;
tail->next = NULL;

add_list(head , tail);
print_list(head , tail);
all_free(head , tail);
free(head);
free(tail);
head = NULL;
tail = NULL;
return 0;
}
  • 回答No.1

ベストアンサー率 23% (3656/15482)

いろいろとダメ.
head が正しく初期化されていないし, head.next も全然変更されない.
紙の上で動作を確認すればわかるはずなんだけど, こんなので動くはずがない.
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ