はじめて投票します
C言語の連結リストについてなのですが、
連結リストの要素を挿入するプログラムで
書いたプログラムが
typedef struct CELL{ //リストの構造体
struct CELL *next;
int value;
};
CELL *header; //先頭要素
int main (void){
int val,Num;
header=(CELL*)malloc(sizeof(CELL)); //メモリの確保
if(header==NULL) exit(1);
header->next=NULL;
header->value=0;
printf("追加するリストの値を入力してください ");
scanf("%d",&val); //追加要素の値
printf("リストの挿入する場所は何番目ですか? ");
scanf("%d",&Num); //追加する場所
insert(header,val,Num); //追加関数
putchar('\n');
showlist(header); //リストの表示
return 0;
}
//表示関数
void showlist(CELL *header){
CELL *x;
for(x=header;x!=NULL;x=x->next)
printf("%d\n",x->value);
free(x);
}
//リストへの追加関数
void insert(CELL *header, int val,int Num){
CELL *New; //挿入するリスト
int i;
New=(CELL*)malloc(sizeof(CELL));
if(New==NULL) exit(1);
if(Num==1){ //先頭に挿入するとき
New->value=val;
New->next=header;
header=New;
}else{ //先頭以外に挿入するとき
for(i=1;header->next!=NULL && i<Num;i++){ //挿入場所へのリストの移動
header=header->next;
}
New->value=val;
New->next=header->next;
header->next=New;
}
}
という感じに書いたのですが
先頭以外の挿入はうまくいくのですが、先頭への挿入がうまくいかないです
よければ、おしえてください
よろしくお願いします
連結リストについての質問です
Re:連結リストについての質問です
main関数内の
showlist(header);
という呼び出しは、「グローバル変数headerからのCell構造体を表示する」という意味です。
要素を挿入する前はリストの様子は以下のような感じです。
「header」→「NULL」
insert関数を呼び出して、要素を「先頭に挿入した」直後のリストの様子は以下のとおりです。
「NEW」→「header」→「NULL」
この状態でshowlist(header)を呼び出すと、当然NEWの要素は表示されません。
さっきも述べた通り、「グローバル変数headerからのCell構造体を表示する」だからです。
さて、何がダメなのか?
ですが、insert関数でheaderの値をNEWで書き換えていますが、この変数hearderが
「グローバル変数header」ではなく、「insert関数の局所変数header」だからです。
先頭に挿入する際は、「グローバル変数header」を書き換える必要があります。
showlist(header);
という呼び出しは、「グローバル変数headerからのCell構造体を表示する」という意味です。
要素を挿入する前はリストの様子は以下のような感じです。
「header」→「NULL」
insert関数を呼び出して、要素を「先頭に挿入した」直後のリストの様子は以下のとおりです。
「NEW」→「header」→「NULL」
この状態でshowlist(header)を呼び出すと、当然NEWの要素は表示されません。
さっきも述べた通り、「グローバル変数headerからのCell構造体を表示する」だからです。
さて、何がダメなのか?
ですが、insert関数でheaderの値をNEWで書き換えていますが、この変数hearderが
「グローバル変数header」ではなく、「insert関数の局所変数header」だからです。
先頭に挿入する際は、「グローバル変数header」を書き換える必要があります。
Re:連結リストについての質問です
投稿されたソースをそのままコンパイルしようとしたところ、
多数(詳細は省略)のエラーが出てコンパイルできません。
一例を挙げると、// の直前に全角空白があるのは、いかにもまずいですね。
>先頭以外の挿入はうまくいくのですが、先頭への挿入がうまくいかないです
こう書かれているということは、質問者さんのところでは
コンパイルできているわけですね。
そのソースを、そっくりそのまま載せてください。
話はそれからです。
多数(詳細は省略)のエラーが出てコンパイルできません。
一例を挙げると、// の直前に全角空白があるのは、いかにもまずいですね。
>先頭以外の挿入はうまくいくのですが、先頭への挿入がうまくいかないです
こう書かれているということは、質問者さんのところでは
コンパイルできているわけですね。
そのソースを、そっくりそのまま載せてください。
話はそれからです。
Re:連結リストについての質問です
局所変数ですね^^;
グローバル変数で宣言する
グローバル変数で表現するとできました
局所変数などの気配りが足りなかったです
回答いただきありがとうございました
グローバル変数で宣言する
グローバル変数で表現するとできました
局所変数などの気配りが足りなかったです
回答いただきありがとうございました