

先頭ポインタだけでなく、末端のポインタも持つ単方向線上リストを作成するために、構造体queueの変数qを定義し、リストヘッドとする。どうすればいいのでしょうか?以下の図のような単位方向線状リストを作りたいです。
key next
top□→'a' ◻︎ → 'b' ◻︎ → 'c'◻︎
btm→→→→→→→→→→→→→↑
#include <stdio.h>
// DATA型の構造体
typedef struct data{
char key;
struct data *next;
} DATA;
// QUEUE型の構造体K
typedef struct queue{
DATA*top;
DATA*btm;
} QUEUE;
int main(void){
DATA c={'c',NULL};
DATA b={'b',&c};
DATA a={'a',&b};
QUEUE q={&a,&c};
printf("%c\n",q.top->key);
printf("%c\n",q.top->next->key);
printf("%c\n",q.btm->key);
printf("\n");
return 0;
}
出力命令
printf("%c\n",q.top->key);
printf("%c\n",q.top->next->key);
printf("%c\n",q.btm>key);
出力結果
a
b
c

No.4ベストアンサー
- 回答日時:
「
DATA c={'c',NULL};
DATA b={'b',&c};
DATA a={'a',&b};
QUEUE q={&a,&c};
」
の解説ですね。
データはa->b->cの順で、cが最後なので、データcのnextはNULLを設定します。
データbのnextはcなのでcのアドレス(cへのポインター)を設定します。
データaのnextはbなのでbのアドレス(bへのポインター)を設定します。
qのtopは、先頭データがaなのでaのアドレス(aへのポインター)を設定します。
qのbtmは、最終データがcなのでcのアドレス(cへのポインター)を設定します。
となります。

No.3
- 回答日時:
>こんな感じでmallocを使いたいってのが、本音です。
うーん。もしかして、データを順に追加する関数とか、データを順に印字する関数を作りたいと
いうことですか。
以下のサンプルは
1.データをキー順に追加する関数(add_data)
2.データを並び順に印字する関数(print_queue)
の実装例です。
-------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
// DATA型の構造体
typedef struct data{
char key;
struct data *next;
} DATA;
// QUEUE型の構造体K
typedef struct queue{
DATA*top;
DATA*btm;
} QUEUE;
//キー順にデータ追加
void add_data(QUEUE *q,char key)
{
DATA *dp;
DATA *wp;
DATA *prev_p = NULL;
dp = malloc(sizeof(DATA));
if (dp == NULL){
printf("メモリ不足\n");
exit(10);
}
dp->key = key;
dp->next = NULL;
//最初のデータの場合
if (q->top == NULL){
q->top = dp;
q->btm = dp;
return;
}
//2番目以降の場合は、先頭からキーを検索し、キーの昇順に並ぶように追加する
wp = q->top;
while(wp){
//追加データキーが処理中データキーより小さい、その前へ追加
if (dp->key < wp->key){
if (prev_p != NULL){ //1つ前のデータがあれば
prev_p->next = dp; //そのnextを更新
}
dp->next = wp; //追加データのnext設定
if (q->top == wp){ //先頭に追加した場合
q->top = dp; //topを更新
}
return;
}
prev_p = wp; //1つ前のデータ
wp = wp->next; //次のデータを処理
}
//終端データまで検索したが、該当データがないので、終端へ追加するケース
prev_p->next = dp; //最後のデータのnext更新
q->btm = dp; //終端ポインターの更新
}
//先頭からキー順にデータを表示
void print_queue(QUEUE *q)
{
DATA *dp;
dp = q->top;
while(dp){
printf("%c\n",dp->key);
dp = dp->next;
}
}
//キュー初期化
void init_queue(QUEUE *q)
{
q->top = NULL;
q->btm = NULL;
}
int main(void)
{
QUEUE q0;
QUEUE *q = &q0;
init_queue(q);
add_data(q,'x');
add_data(q,'b');
add_data(q,'c');
add_data(q,'a');
add_data(q,'y');
add_data(q,'z');
print_queue(q);
return 0;
}
---------------------------------------
以下、実行結果です。
a
b
c
x
y
z
先頭ポインタだけでなく、末端のポインタも持つ単方向線上リストを作成するために、構造体queueの変数qを定義し、リストヘッドとする。これを用いて画像のようにしたいのですが、どうすればいいのでしょうか?
ここを解説してもらってもいいでしょうか?
「
DATA c={'c',NULL};
DATA b={'b',&c};
DATA a={'a',&b};
QUEUE q={&a,&c};
」
#include <stdio.h>
// DATA型の構造体
typedef struct data{
char key;
struct data *next;
} DATA;
// QUEUE型の構造体K
typedef struct queue{
DATA*top;
DATA*btm;
} QUEUE;
int main(void){
DATA c={'c',NULL};
DATA b={'b',&c};
DATA a={'a',&b};
QUEUE q={&a,&c};
printf("%c\n",q.top->key);
printf("%c\n",q.top->next->key);
printf("%c\n",q.btm->key);
printf("\n");
return 0;
}
出力命令
printf("%c\n",q.top->key);
printf("%c\n",q.top->next->key);
printf("%c\n",q.btm>key);
出力結果
a
b
c

No.2
- 回答日時:
>見えないですね・・・・
いやいや、No1の方が言われているように、その通りに作られているように見えます。
あなたが、望んでいることをもっと具体的に書かれたほうが良いかと思います。
こんな感じでmallocを使いたいってのが、本音です。
To: 自分
2日前詳細
#include<stdio.h>
struct data{
char key;
struct data*next;
};
int main(void)
{
struct data*top=NULL;
top=(struct data*)malloc(sizeof(struct data)); //mallocで確保する
top->key='a';
top->next=NULL;
top->next=(struct data*)malloc(sizeof(struct data));
top->next->key='b';
top->next->next=NULL;
top->next->next=(struct data*)malloc(sizeof(struct data));
top->next->next->key='c';
top->next->next->next=NULL;
printf("%c\n",top->key);
printf("%c\n",top->next->key);
printf("%c\n",top->next->next->key);
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
gccを行ってもexeファイルが生...
-
c言語
-
visual studio 2022でのC#プロ...
-
C# DatagridviewにExcelシート...
-
mallocについて
-
C言語って古いですか?
-
C言語関数違いについて。
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
パソコン
-
CPUが16bitでも32bitOSでコンパ...
-
Python、プログラミングについ...
-
だれがとけるの?
-
バッチファイルで以下のような...
-
Notepad++の関数リスト表示の変...
-
VisualStudio2022でC言語プログ...
-
License='MIT' ってなんでmitな...
-
C言語 ストリームについて。
-
c言語でイベントフラグを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報