プロが教える店舗&オフィスのセキュリティ対策術

先頭ポインタだけでなく、末端のポインタも持つ単方向線上リストを作成するために、構造体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

A 回答 (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へのポインター)を設定します。

となります。
    • good
    • 0
この回答へのお礼

ありがとうございます!

お礼日時:2016/11/04 01:09

>こんな感じで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
    • good
    • 0
この回答へのお礼

先頭ポインタだけでなく、末端のポインタも持つ単方向線上リストを作成するために、構造体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

お礼日時:2016/11/04 00:30

>見えないですね・・・・


いやいや、No1の方が言われているように、その通りに作られているように見えます。
あなたが、望んでいることをもっと具体的に書かれたほうが良いかと思います。
    • good
    • 0
この回答へのお礼

こんな感じで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;
}

お礼日時:2016/11/02 10:42

その通りに作られているように見えますが?

    • good
    • 0
この回答へのお礼

見えないですね・・・・

すみません

お礼日時:2016/11/02 08:18

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