【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


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

No.18646

線形リストで…
投稿者---ぺぶ(2004/12/12 21:01:03)


線形リストを使って、入力した文字を、反対に出力するようなプログラム(たとえば、入力:プログラム→出力:ムラグロプ)を作りたいのですが、どうやったら良いでしょうか…?
誰か教えてください><


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> ↑線形リストを使ってテキストを反対に出力する。 18647 ぺぶ 2004/12/12 21:26:57


No.18647

↑線形リストを使ってテキストを反対に出力する。
投稿者---ぺぶ(2004/12/12 21:26:57)


題名がわかりにくいと思ったのでもう1度投稿しました。

>線形リストを使って、入力した文字を、反対に出力するようなプログラム(たとえば、入力:プログラム→出力:ムラグロプ)を作りたいのですが、どうやったら良いでしょうか…?

というものです。
線形リストを使わずにすることはできるのですが…。


この投稿にコメントする

削除パスワード

No.18650

Re:↑線形リストを使ってテキストを反対に出力する。
投稿者---RAPT(2004/12/12 23:05:27)


開発環境と、正順に出力するプログラムを書いてみてください。


この投稿にコメントする

削除パスワード

No.18652

プログラムを書いてみましたが、コンパイルされません…。
投稿者---ぺぶ(2004/12/13 00:45:07)


>開発環境と、正順に出力するプログラムを書いてみてください。

開発環境というのはcygwinでよいのでしょうか…?
これは学校の宿題の一部で、学校ではLINUXでやっていますが、
今は家にいるのでcygwinでやっています。

プログラムなのですが、教科書を参考に作りましたが、
コンパイルされず、どこが間違っているかわかりません。
コンパイル時にでるエラーメッセージによると、
最後のmainの中での、「Data x;」が間違っているようなのですが…。
Parse error before `x;
`x` undecleared;
とでます。
でもこれ以上は手が出ませんでした。

線形リストだけでなく、C言語自体があまり得意ではないので、
あきれられる部分もあるかもしれませんが、
どうかよろしくお願いいたします。


***プログラム***
/*  線形リストを使って文字を出力する */

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


/*--- テキスト ---*/
typedef struct {
char text[500]; /* テキスト */
} Data;


/*--- ノード ---*/
typedef struct __node {
Data data; /* データ */
struct __node *next; /* 後続ノードへのポインタ */
} Node;

/*--- 線形リスト ---*/
typedef struct {
Node *head; /* 先頭ノードへのポインタ */
Node *crnt; /* 着目ノードへのポインタ */
} List;

/*--- 一つのノードを動的に確保 ---*/
Node *AllocNode(void)
{
return ((Node *)calloc(1, sizeof(Node)));
}

/*--- 線形リストを初期化 ---*/
void InitList(List *list)
{
list->head = NULL; /* 先頭ノード */
list->crnt = NULL; /* 着目ノード */
}

/*--- ノードの各メンバに値を設定 ----*/
void SetNode(Node *n, Data x, Node *next)
{
n->next = next; /* テキスト */
}

/*--- 先頭にノードを挿入 ---*/
void InsertFront(List *list, Data x)
{
Node *ptr = list->head;
list->head = list->crnt = AllocNode();
SetNode(list->head, x, ptr);
}

/*--- データを表示 ---*/
void PrintData(Data x)
{
printf("%s\n", x.text);
}

/*--- ノードのデータを表示 ---*/
void PrintList(List *list)
{
if (list->head == NULL)
puts("ノードがありません。");
else {
Node *ptr = list->head;

while (ptr != NULL) {
PrintData(ptr->data);
ptr = ptr->next; /* 後続ノードに着目 */
}
}
}



/*--- データの入力 ---*/
Data Read(const char *message, int sw)
{
Data temp;

printf("文字を入力してください。:");

scanf("%s", temp.text);
return (temp);
}


/*--- メイン ---*/
int main(void)
{
List list;

InitList(&list); /* 線形リストの初期化 */
Data x;
InsertFront(&list, x);
PrintList(&list);

return 0;
}





この投稿にコメントする

削除パスワード

No.18653

Re:プログラムを書いてみましたが、コンパイルされません…。
投稿者---しっぽ(2004/12/13 01:47:09)


> 最後のmainの中での、「Data x;」が間違っているようなのですが…。
惜しい。C言語では Data x; は InitList(&list); より前でないと、ダメです。

あと Data x にデータを入れてください。



この投稿にコメントする

削除パスワード

No.18657

正順表示はできました…。申し訳ありません!
投稿者---ぺぶ(2004/12/13 10:15:13)


先ほど投稿したものを間違って削除してしまいました。
アドバイスのとおり、ノードにデータをいれると、
無事出力できるようになりました。
本当に申し訳ありません。

そして、これを逆順に出力するのにはどういう操作をしたら良いのでしょうか…?


***正順プログラム***
/*  線形リストを使って文字を出力する */

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


/*--- テキスト ---*/
typedef struct {
char text[500]; /* テキスト */
} Data;


/*--- ノード ---*/
typedef struct __node {
Data data; /* データ */
struct __node *next; /* 後続ノードへのポインタ */
} Node;

/*--- 線形リスト ---*/
typedef struct {
Node *head; /* 先頭ノードへのポインタ */
Node *crnt; /* 着目ノードへのポインタ */
} List;

/*--- 一つのノードを動的に確保 ---*/
Node *AllocNode(void)
{
return ((Node *)calloc(1, sizeof(Node)));
}

/*--- 線形リストを初期化 ---*/
void InitList(List *list)
{
list->head = NULL; /* 先頭ノード */
list->crnt = NULL; /* 着目ノード */
}

/*--- ノードの各メンバに値を設定 ----*/
void SetNode(Node *n, Data x, Node *next)
{
n->data = x;
n->next = next; /* テキスト */
}

/*--- 先頭にノードを挿入 ---*/
void InsertFront(List *list, Data x)
{
Node *ptr = list->head;
list->head = list->crnt = AllocNode();
SetNode(list->head, x, ptr);
}

/*--- データを表示 ---*/
void PrintData(Data x)
{
printf("%s\n", x.text);
}

/*--- ノードのデータを表示 ---*/
void PrintList(List *list)
{


if (list->head == NULL)
puts("ノードがありません。");
else {
Node *ptr = list->head;

while (ptr != NULL) {
PrintData(ptr->data);
ptr = ptr->next; /* 後続ノードに着目 */
}
}

}




/*--- データの入力 ---*/
Data Read(const char *message)
{
Data temp;

printf("%sを入力してください。:", message);

scanf("%s", temp.text);
return (temp);
}


/*--- メイン ---*/
int main(void)
{
List list;
Data x;

InitList(&list); /* 線形リストの初期化 */

x = Read("テキスト");
InsertFront(&list, x);
          PrintList(&list);

return 0;
}



まず一文字ずつ入力するように変更すべきですか?
このままで逆順というのは無理なのでしょうか…?


この投稿にコメントする

削除パスワード

No.18658

Re:正順表示はできました…。申し訳ありません!
投稿者---Hermit(2004/12/13 10:28:15)


追加しようと思って、私が削除したので、気にせずに(^^;

/*--- ノードの各メンバに値を設定 ----*/
void SetNode(Node *n, Data x, Node *next)
{
    char *s,*e;
    n->data = x; /*文字列を入れていなかった */
    n->next = next;

    /* strrev 文字列反転、wchar は考慮してません*/
    s = n->data.text;
    e = s + strlen(s);
    while (--e>s) {
        register char tmp = *e;
        *e = *s;
        *s++=tmp;
    }   
}




この投稿にコメントする

削除パスワード

No.18662

Re:正順表示はできました…。申し訳ありません!
投稿者---ぺぶ(2004/12/13 11:00:46)


何回も、本当にありがとうございます。

>*--- ノードの各メンバに値を設定 ----*/
void SetNode(Node *n, Data x, Node *next)
{
char *s,*e;
n->data = x; /*文字列を入れていなかった */
n->next = next;

/* strrev 文字列反転、wchar は考慮してません*/
s = n->data.text;
e = s + strlen(s);
while (--e>s) {
register char tmp = *e;
*e = *s;
*s++=tmp;
}
}


とのことですが、これで文字をいれかえているのだなぁということは
なんとなくわかるのですが、これをこのまま挿入しても、
エラーがたくさんでて、うまくいきません。
何をしているのかとどういう対処をすればよいかを
教えていただけませんでしょうか…?







この投稿にコメントする

削除パスワード

No.18665

Re:正順表示はできました…。申し訳ありません!
投稿者---Hermit(2004/12/13 12:00:05)


家ではエラーは出ないので、説明だけ。

>char *s,*e;
文字入れ替え用のポインタ
start と、end のつもり。

>n->data = x; /*文字列を入れていなかった */
>n->next = next;

>/* strrev 文字列反転、wchar は考慮してません*/
>s = n->data.text;
先頭の文字の位置を入れる。

>e = s + strlen(s);
先頭のアドレスに、文字の長さを足す。
最後の '\0'(null文字)の位置を入れてる。

>while (--e>s) {
s と、e の位置が、逆転するまで。
s の位置は、後で変えている。
e の位置は、最初'\0'なので、
その前の位置から始めるためここで一つ前に変えている
ループ中も、ここで一文字ずつ位置が前に移っていく。

>register char tmp = *e;
入れ替えのために、e の文字をいったん退避

>*e = *s;
s の文字を、e に入れる。

>*s++=tmp;
退避した e の文字を s に入れて、
s の位置をひとつ後に変更する

>}
while(--e>s) に戻る。
前にも書いたが、e は、戻った時点でひとつ前の位置に移動する。


こんなもんでわかるだろうか・・・


この投稿にコメントする

削除パスワード

No.18669

ありがとうございました!
投稿者---peb(2004/12/13 14:52:09)


何度も丁寧に教えてくださり、
本当にありがとうございました。

家のパソコンではできなかったのですが、
学校のパソコンでやってみると、
コンパイルも出力もきちんとできるようになりました。

本当にうれしいです。
これからもがんばって勉強していきたいと思いますので、
どうぞよろしくお願いいたします。


***最終版***

/*  線形リストを使って文字を出力する */

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


/*--- テキスト ---*/
typedef struct {
char text[500]; /* テキスト */
} Data;


/*--- ノード ---*/
typedef struct __node {
Data data; /* データ */
struct __node *next; /* 後続ノードへのポインタ */
} Node;

/*--- 線形リスト ---*/
typedef struct {
Node *head; /* 先頭ノードへのポインタ */
Node *crnt; /* 着目ノードへのポインタ */
} List;

/*--- 一つのノードを動的に確保 ---*/
Node *AllocNode(void)
{
return ((Node *)calloc(1, sizeof(Node)));
}

/*--- 線形リストを初期化 ---*/
void InitList(List *list)
{
list->head = NULL; /* 先頭ノード */
list->crnt = NULL; /* 着目ノード */
}

/*--- ノードの各メンバに値を設定 ----*/
void SetNode(Node *n, Data x, Node *next)
{
char *s,*e;
n->data = x; /*文字列を入れていなかった */
n->next = next;

/* strrev 文字列反転、wchar は考慮してません*/
s = n->data.text;
e = s + strlen(s);
while (--e>s) {
register char tmp = *e;
*e = *s;
*s++=tmp;
}
}

/*--- 先頭にノードを挿入 ---*/
void InsertFront(List *list, Data x)
{
Node *ptr = list->head;
list->head = list->crnt = AllocNode();
SetNode(list->head, x, ptr);
}

/*--- データを表示 ---*/
void PrintData(Data x)
{
printf("%s\n", x.text);
}

/*--- ノードのデータを表示 ---*/
void PrintList(List *list)
{


if (list->head == NULL)
puts("ノードがありません。");
else {
Node *ptr = list->head;

while (ptr != NULL) {
PrintData(ptr->data);
ptr = ptr->next; /* 後続ノードに着目 */
}
}

}




/*--- データの入力 ---*/
Data Read(const char *message)
{
Data temp;

printf("%sを入力してください。:", message);

scanf("%s", temp.text);
return (temp);
}


/*--- メイン ---*/
int main(void)
{
List list;
Data x;

InitList(&list); /* 線形リストの初期化 */

x = Read("テキスト");
InsertFront(&list, x);
          PrintList(&list);

return 0;
}




この投稿にコメントする

削除パスワード

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