上記プログラムでは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;
}