リストの追加
リストの特徴は、好きな場所へのデータ(ノード)の追加が簡単(計算負担がすくなく)済むところにある。
1)入れたい場所を探す
2)入れるノードを作る
3)リストを挿入(追加)する
次のプログラム listadd1.c のうち、追加をするのは次の部分
code: insert.c
l->next = s->next; // この二行で挿入している
s->next = l; // この二行で挿入している
10個のデータがリストになっているとき、数値 5 の次に 100 を挿入する
code:listadd1.c
typedef struct Node{
int data;
struct Node * next;
} Node;
Node * node_new();
void node_print(Node * np);
Node * node_search(Node *list, int data);//データ がある値dataのノードを探す
int main(void){
Node *head, *l, *s;
int i;
head = node_new(); // ヘッダーノード
s = head; // リスト全体
// 1から9までの10個のリスト
for(i = 1; i<10; i++){
l = node_new();
l->data = i;
s->next = l;
s = s->next;
}
node_print(head->next);
s = node_search(head, 5); //data が5のノードを探す
l = node_new();
l->data = 100; // data が 100 の新しいノードを作る
l->next = s->next; // この二行で挿入している
s->next = l; // この二行で挿入している
node_print(head->next);
}
Node * node_new(){
Node *l;
l = malloc(sizeof(Node)); // 名前のない Node 一個分のメモリを確保して、そのポインタを l にしまう
l->data = 0;
l->next = NULL;
return l;
}
void node_print(Node * np){
while(1){
if(np == NULL) break;
printf("%d ", np->data);
np = np->next;
}
printf("\n");
}
Node * node_search(Node *list, int data){
while(1){
if(list->next == NULL) break; // なかった
list = list->next;
if(list->data == data) break; // みつけた
}
return list;
}
キーボードから適当な個数の数値を読み込み、読み込み順に記憶するプログラム
code:listadd2.c
typedef struct Node{
int data;
struct Node * next;
} Node;
Node * node_new();
void node_print(Node * np);
Node * node_search(Node *list, int data);//データ がある値dataのノードを探す
int main(void){
Node *head, *l, *s;
int input;
head = node_new(); // ヘッダーノード
s = head; // リスト全体
scanf("%d", &input);
while(input != 0){
l = node_new();
l->data = input;
s->next = l;
s = s->next;
scanf("%d", &input);
}
node_print(head->next);
s = node_search(head, 5); //data が5のノードを探す
l = node_new();
l->data = 100; // data が 100 の新しいノードを作る
l->next = s->next; // この二行で挿入している
s->next = l; // この二行で挿入している
node_print(head->next);
}
Node * node_new(){
Node *l;
l = malloc(sizeof(Node)); // 名前のない Node 一個分のメモリを確保して、そのポインタを l にしまう
l->data = 0;
l->next = NULL;
return l;
}
void node_print(Node * np){
while(1){
if(np == NULL) break;
printf("%d ", np->data);
np = np->next;
}
printf("\n");
}
Node * node_search(Node *list, int data){
while(1){
if(list->next == NULL) break; // なかった
list = list->next;
if(list->data == data) break; // みつけた
}
return list;
}
listadd2.c の入力として 1 2 3 4 5 6 7 8 9 0 を入れると、0で入力終了して、5の次に100を加えて出力する。データをいくら増やしても動作する。
クイズ
listadd2.c で 入力データに 5 が含まれないときの動きを考えてみよう
ノードの追加の様子を図に書いてみよう
演習問題
1) listadd1.c を変更して 1、3、5、7 の次にそれぞれ 100、300、500、700 を追加するプログラムを書こう
2) listadd1.c を変更して 5の次に500を追加、500の次に501、502、503 を追加、3のあとに300を追加するプログラムを書こう
探し始めをどこにするかで目的の場所が見つからないことがあるので注意しよう
出力は 1 2 3 300 4 5 500 501 502 503 6 7 8 9 が(一行に一つずつ)表示されればよい
3) listadd2.c を変更して、入力のすべての 5 のあとに 500 を追加するプログラムを書こう
入力例 1 3 5 7 5 3 1 0 出力例 1 3 5 500 7 5 500 3 1 (0は終わりなのでデータに含まれない)