「キーボードから非負整数を入力し,その非負整数を格納するためのセルを動的に確保し,連結リストの先頭に追加していくプログラムを作成しなさい.入力は負の整数を読み込むまで続けるものとする.」という問題(上記のコード)の挿入部分をinsert関数を作成し実行できるように改造しなさいという問題なんですが(下記のコード),を作成し実行すると -現在の実行-のようにアドレス(?)が出力されてしまいます。どこの部分を修正すればいけないのかご指摘よろしくお願いします。
上記プログラムではgFrontは(ポインタでなく)セルを表す変数そのものでした.そのため,nextメンバを参照するためにgFront.nextのようにドット.を用いました.しかし,今回作成するinsert関数では,挿入したいセルはポインタ(pre)として与えられます.したがって,そのセルのnextメンバを参照するのにドットは使えないことに注意してくださいと書いてあります...
-目標の実行例-
10 20 30 40 50 60 70 80 -1 #キーボード入力
LIST[ 10 ] #10をダミーセルの次に追加
LIST[ 20 10 ] #20をダミーセルの次に追加
LIST[ 30 20 10 ] #30をダミーセルの次に追加
LIST[ 40 30 20 10 ] #以下同様
-現在の実行-
10 20 30 40
LIST[-2144187768 ]
LIST[2026043616 -2144187768 ]
LIST[-208891995 2026043616 -2144187768 ]
LIST[544 -208891995 2026043616 -2144187768 ]
コード:
#include<stdio.h>
#include<stdlib.h>
struct cell{
int value; /*このセルが持つデータ*/
struct cell *next; /*次のセルを指すポインタ*/
};
/*連結リストの先頭を指すダミーセル,今回はvalueの値を-1にする*/
struct cell gFront = {-1, NULL};
void printList(void){
struct cell *p;
printf("LIST[");
p = gFront.next;
while(p != NULL){
printf("%d ",(*p).value);
p = (*p).next;
}
printf("]\n");
}
int main(void){
int a;
struct cell *p;
scanf("%d",&a);
while(a >= 0){
p = malloc(sizeof(struct cell));
if(p == NULL){
fprintf(stderr,"エラー: malloc失敗\n");
exit(1);
}
(*p).value = a;
/***********************/
/*連結リストの先頭に追加する*/
/**********************/
/*(1)まず,新しいセルが今の先頭セルを指すようにする*/
(*p).next = gFront.next;
/*(2)次に,ダミーセルが新しいセルを指すようにする*/
gFront.next = p;
printList();
scanf("%d",&a);
}
printf("入力を終了しました\n");
return 0;
}
コード:
#include<stdio.h>
#include<stdlib.h>
struct cell{
int value;
struct cell *next;
};
struct cell gFront = {-1, NULL};
void printList(void){
struct cell *p;
printf("LIST[");
p = gFront.next;
while(p != NULL){
printf("%d ",p->value);
p = p->next;
}
printf("]\n");
}
/************insert関数*******************/
void insert(struct cell *pre, struct cell *new){
if(pre == NULL || new == NULL)
fprintf(stderr,"insert: 引数 pre または new がNULLです。\n");
new -> next = pre -> next;
pre -> next = new;
}
int main(void){
int a;
struct cell *p;
scanf("%d",&a);
while(a >= 0){
p = malloc(sizeof(struct cell));
if(p == NULL){
fprintf(stderr,"エラー: malloc失敗\n");
exit(1);
}
insert(&gFront,p);
printList();
scanf("%d",&a);
}
printf("入力を終了しました\n");
return 0;
}
[shadow=blue]「キーボードから非負整数を入力し,その非負整数を格納するためのセルを動的に確保し,連結リストの先頭に追加していくプログラムを作成しなさい.入力は負の整数を読み込むまで続けるものとする.」[/shadow]という問題(上記のコード)の挿入部分をinsert関数を作成し実行できるように改造しなさいという問題なんですが(下記のコード),を作成し実行すると -現在の実行-のようにアドレス(?)が出力されてしまいます。どこの部分を修正すればいけないのかご指摘よろしくお願いします。
[shadow=blue]上記プログラムではgFrontは(ポインタでなく)セルを表す変数そのものでした.そのため,nextメンバを参照するためにgFront.nextのようにドット.を用いました.しかし,今回作成するinsert関数では,挿入したいセルはポインタ(pre)として与えられます.したがって,そのセルのnextメンバを参照するのにドットは使えないことに注意してください[/shadow]と書いてあります...
-目標の実行例-
10 20 30 40 50 60 70 80 -1 #キーボード入力
LIST[ 10 ] #10をダミーセルの次に追加
LIST[ 20 10 ] #20をダミーセルの次に追加
LIST[ 30 20 10 ] #30をダミーセルの次に追加
LIST[ 40 30 20 10 ] #以下同様
-現在の実行-
10 20 30 40
LIST[-2144187768 ]
LIST[2026043616 -2144187768 ]
LIST[-208891995 2026043616 -2144187768 ]
LIST[544 -208891995 2026043616 -2144187768 ]
[code]
#include<stdio.h>
#include<stdlib.h>
struct cell{
int value; /*このセルが持つデータ*/
struct cell *next; /*次のセルを指すポインタ*/
};
/*連結リストの先頭を指すダミーセル,今回はvalueの値を-1にする*/
struct cell gFront = {-1, NULL};
void printList(void){
struct cell *p;
printf("LIST[");
p = gFront.next;
while(p != NULL){
printf("%d ",(*p).value);
p = (*p).next;
}
printf("]\n");
}
int main(void){
int a;
struct cell *p;
scanf("%d",&a);
while(a >= 0){
p = malloc(sizeof(struct cell));
if(p == NULL){
fprintf(stderr,"エラー: malloc失敗\n");
exit(1);
}
(*p).value = a;
/***********************/
/*連結リストの先頭に追加する*/
/**********************/
/*(1)まず,新しいセルが今の先頭セルを指すようにする*/
(*p).next = gFront.next;
/*(2)次に,ダミーセルが新しいセルを指すようにする*/
gFront.next = p;
printList();
scanf("%d",&a);
}
printf("入力を終了しました\n");
return 0;
}
[/code]
[code]
#include<stdio.h>
#include<stdlib.h>
struct cell{
int value;
struct cell *next;
};
struct cell gFront = {-1, NULL};
void printList(void){
struct cell *p;
printf("LIST[");
p = gFront.next;
while(p != NULL){
printf("%d ",p->value);
p = p->next;
}
printf("]\n");
}
/************insert関数*******************/
void insert(struct cell *pre, struct cell *new){
if(pre == NULL || new == NULL)
fprintf(stderr,"insert: 引数 pre または new がNULLです。\n");
new -> next = pre -> next;
pre -> next = new;
}
int main(void){
int a;
struct cell *p;
scanf("%d",&a);
while(a >= 0){
p = malloc(sizeof(struct cell));
if(p == NULL){
fprintf(stderr,"エラー: malloc失敗\n");
exit(1);
}
insert(&gFront,p);
printList();
scanf("%d",&a);
}
printf("入力を終了しました\n");
return 0;
}
[/code]