
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行ずつ入れていっています。
No.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();
すれば良いかと。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
双方向リストのバブルソートに...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
20'(角度)の計算がわかりま...
-
Enterキーを押されたら次の処理...
-
iconv_open失敗
-
エラー 添字が付けられた値が、...
-
信頼区間の1.96や1.65ってどこ...
-
「指定されたキャストは有効で...
-
有効数字について 以前質問をし...
-
EXCELの分散分析表のP-値が....
-
C言語で分からないところがあり...
-
C言語 エラーの原因がわからな...
-
構文エラー";"が型の前にあり...
-
入力値が1以下、かつ数字以外の...
-
2÷3などの余りについて
-
テキストデータをそのままバイ...
-
複数桁10進数の*桁目だけを抽出...
-
std::set<int> で、ある値が何...
-
#define _CRT_SECURE_NO_WARNIN...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報