掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27006

線形リスト
投稿者---pon(2006/05/29 23:04:03)


線形リストについて勉強していたのですが、
仕組みはわかりました。
データがデータだけでなく、次の値のアドレスのポインタを持っている。
cell[data|next address]

ただ、実際にたとえば、5,4,3,2,1,0の文字を線形リストで管理して、
最初から出力するみたいなのはどうやってつくればいいのでしょうか?

どなたか線形リストの例をプログラム例をあげていただけないでしょうか?(ただし、ソートとか難しいのではなくあくまで私のようなバカでもわかるようなものを提示していただけたらありがたいです。)


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:線形リスト 27007 si 2006/05/30 00:07:25


No.27007

Re:線形リスト
投稿者---si(2006/05/30 00:07:25)


入力ラインを逆順に表示するサンプル
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _line_t {
    char *line;
    struct _line_t *next;
} line_t;

int main(void)
{
    line_t *p = NULL;
    line_t *q;
    char buf[512];
    
    while (fgets(buf,512,stdin)) {
        q = malloc(sizeof(line_t));
        if (q == NULL)
            break;
        if ((q->line = strdup(buf)) == NULL) {
            free(q);
            break;
        }
        q->next = p;
        p = q;
    }
    while (p) {
        printf("%s",p->line);
        q = p->next;
        free(p->line);
        free(p);
        p = q;
    }
}



この投稿にコメントする

削除パスワード

No.27008

線形リスト
投稿者---pon(2006/05/30 00:18:04)


もしよろしければコメントなりの解説をしていただけるとありがたいのですが。。。
でもなんとなくわかりました!!


この投稿にコメントする

削除パスワード

No.27009

線形リスト
投稿者---pon(2006/05/30 00:21:09)


後失礼ですが_line_tってのはどういうことなんでしょうか?


この投稿にコメントする

削除パスワード

No.27012

Re:線形リスト
投稿者---KING・王(2006/05/30 00:59:39)


>後失礼ですが_line_tってのはどういうことなんでしょうか?

構造体のタグ名です。
> http://www9.plala.or.jp/sgwr-t/c/sec15.html
でも参照してください


この投稿にコメントする

削除パスワード

No.27013

Re:線形リスト
投稿者---h3X(2006/05/30 01:07:34)


>構造体のタグ名です。
>> http://www9.plala.or.jp/sgwr-t/c/sec15.html
>でも参照してください

割り込んですみません。

以前から気になってたのですが、なぜ

typedef struct line_t { ... } line_t;

と書くのではなく

typedef struct _line_t { ... } line_t;

とline_tの前に「_」を付けるのでしょうか?


この投稿にコメントする

削除パスワード

No.27014

線形リスト
投稿者---pon(2006/05/30 01:13:41)


私もそれについての質問だったのです!!


この投稿にコメントする

削除パスワード

No.27016

Re:線形リスト
投稿者---h3X(2006/05/30 01:36:07)


>以前から気になってたのですが、なぜ
>
>typedef struct line_t { ... } line_t;
>
>と書くのではなく
>
>typedef struct _line_t { ... } line_t;
>
>とline_tの前に「_」を付けるのでしょうか?

自己レスになってすみません.

ふと思いついたのですが,標準ライブラリ(libc)内等では,
ユーザー定義の構造体とかち合い,二重定義になるのを防ぐために
「_」や「__」を付けているのではないでしょうか?(2重インクルードガードのように)

すると,ユーザー側では極力「_」や「__」等を使わない方が良いのでは
ないでしょうか?


この投稿にコメントする

削除パスワード

No.27019

Re:線形リスト
投稿者---YuO(2006/05/30 01:57:06)


>ふと思いついたのですが,標準ライブラリ(libc)内等では,
>ユーザー定義の構造体とかち合い,二重定義になるのを防ぐために
>「_」や「__」を付けているのではないでしょうか?(2重インクルードガードのように)
>すると,ユーザー側では極力「_」や「__」等を使わない方が良いのでは
>ないでしょうか?

ISO/IEC 9899:1999 7.1.3 Reserved Identifiers
でいくつか制限がかかります。要約すると,
・_から始まり,大文字or_が続く識別子は全ての目的において予約
・_から始まるすべてのファイルスコープの通常の/タグの識別子は予約
なので,_line_tは予約された識別子になります。
# C++だとまた異なったりするのがややこしい……。


私の場合,_から始まる識別子は使い分けが面倒なので一切使わないという方針です。
ただし,タグ名とtypedef名を同じにするのも気持ちが悪いので (異なる名前空間なのはわかっていますが),タグ名は大抵tagを前置しています。



この投稿にコメントする

削除パスワード

No.27021

Re:線形リスト
投稿者---h3X(2006/05/30 09:16:38)


YuOさん端的なご回答ありがとうございます.

スッキリしました.


この投稿にコメントする

削除パスワード

No.27027

Re:線形リスト
投稿者---sizu(2006/05/30 16:25:56)


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

typedef struct _cell{
int data;
struct _cell *next;
}cell;

int main()
{
cell *p = NULL;
cell *temp;
int data;

while(scanf("%d", &data) != EOF){
temp = malloc(sizeof(cell));
if(data == NULL)
break;
temp->next = p;
temp->data = data;
p = temp;
}
while (p) {
printf("%s",p->data);
temp = p->next;
free(p);
p = temp;
}
}
こんなのはだめ?


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧