連結リストについての質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
夏ミカン

連結リストについての質問です

#1

投稿記事 by 夏ミカン » 15年前

はじめて投票します

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;

}

}

という感じに書いたのですが
先頭以外の挿入はうまくいくのですが、先頭への挿入がうまくいかないです
よければ、おしえてください
よろしくお願いします

Poco

Re:連結リストについての質問です

#2

投稿記事 by Poco » 15年前

main関数内の

showlist(header);

という呼び出しは、「グローバル変数headerからのCell構造体を表示する」という意味です。
要素を挿入する前はリストの様子は以下のような感じです。

「header」→「NULL」

insert関数を呼び出して、要素を「先頭に挿入した」直後のリストの様子は以下のとおりです。

「NEW」→「header」→「NULL」

この状態でshowlist(header)を呼び出すと、当然NEWの要素は表示されません。
さっきも述べた通り、「グローバル変数headerからのCell構造体を表示する」だからです。

さて、何がダメなのか?
ですが、insert関数でheaderの値をNEWで書き換えていますが、この変数hearderが
「グローバル変数header」ではなく、「insert関数の局所変数header」だからです。
先頭に挿入する際は、「グローバル変数header」を書き換える必要があります。

box

Re:連結リストについての質問です

#3

投稿記事 by box » 15年前

投稿されたソースをそのままコンパイルしようとしたところ、
多数(詳細は省略)のエラーが出てコンパイルできません。
一例を挙げると、// の直前に全角空白があるのは、いかにもまずいですね。

>先頭以外の挿入はうまくいくのですが、先頭への挿入がうまくいかないです

こう書かれているということは、質問者さんのところでは
コンパイルできているわけですね。
そのソースを、そっくりそのまま載せてください。
話はそれからです。

夏ミカン

Re:連結リストについての質問です

#4

投稿記事 by 夏ミカン » 15年前

局所変数ですね^^;

グローバル変数で宣言する

グローバル変数で表現するとできました
局所変数などの気配りが足りなかったです
回答いただきありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る