題目2: リスト
ソースコードのひな型および実行例
実験1: 関数printList
ソースコードのひな型
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* next;
};
/* 実験 1 で作成 */
void printList( struct node* head ) {
/* 内容は自分で作る */
}
int main(void){
struct node* head;
struct node* p;
/* 最初にダミーノードを用意しておく */
head = (struct node*) malloc(sizeof(struct node));
head->next = NULL;
/* 1 個目のノードを作成 */
p = (struct node*) malloc(sizeof(struct node));
p->data = 16;
head->next = p;
/* 2 個目のノードを 1 個目のノードの後ろに作成 */
p->next = (struct node*) malloc(sizeof(struct node));
p = p->next;
p->data = 28;
/* 3 個目のノードを 2 個目のノードの後ろに作成 */
p->next = (struct node*) malloc(sizeof(struct node));
p = p->next;
p->data = 100;
/* 3 個目のノードでおしまいなので,next を NULL にする */
p->next = NULL;
/* リストの内容が順番に表示される */
printList(head);
/* 確保したメモリを解放する */
while (head) {
p = head->next;
free(head);
head = p;
}
return 0;
}
実行例
$ ./a.out
16 28 100
実験2: 関数search
ソースコードのひな型
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* next;
};
/* 実験 2 で作成 */
int search( struct node* head, int x ){
/* 内容は自分で作る */
}
int main(void){
struct node* head;
struct node* p;
int n, x;
/* 最初にダミーノードを用意しておく */
head = (struct node*) malloc(sizeof(struct node));
head->next = NULL;
/* 1 個目のノードを作成 */
p = (struct node*) malloc(sizeof(struct node));
p->data = 16;
head->next = p;
/* 2 個目のノードを 1 個目のノードの後ろに作成 */
p->next = (struct node*) malloc(sizeof(struct node));
p = p->next;
p->data = 28;
/* 3 個目のノードを 2 個目のノードの後ろに作成 */
p->next = (struct node*) malloc(sizeof(struct node));
p = p->next;
p->data = 100;
/* 3 個目のノードでおしまいなので,next を NULL にする */
p->next = NULL;
/* x を読み込み,それがリスト内の何番目にあるか調べる */
printf("目的の値を入力して下さい > ");
scanf("%d", &x);
n = search(head, x);
if ( -1 == n ){
printf("%d は見つかりませんでした\n", x);
}
else{
printf("%d は %d 番目に見つかりました\n", x, n);
}
/* 確保したメモリを解放する */
while (head) {
p = head->next;
free(head);
head = p;
}
return 0;
}
実行例
$ ./a.out
目的の値を入力して下さい > 28
28 は 2 番目に見つかりました
実験3: 関数append
ソースコードのひな型
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* next;
};
/* 実験 1 で作成 */
void printList( struct node* head ) {
/* 内容は自分で作る */
}
/* 実験 3 で作成 */
void append( struct node* head, int x ){
/* 内容は実験テキストを参照 */
}
int main(void){
struct node* head;
int x;
struct node* p;
/* 最初にダミーノードを用意しておく */
head = (struct node*) malloc(sizeof(struct node));
head->next = NULL;
printf("値を繰り返し入力して下さい(-1で終了): \n");
/* 内容は自分で作る: */
/* scanf で値を読み込みながら append でその値をリストに追加 */
/* (ヒント)while 文で繰り返す */
/* 確保したメモリを解放する */
while (head) {
p = head->next;
free(head);
head = p;
}
return 0;
}
実行例
$ ./a.out
値を繰り返し入力して下さい(-1で終了):
1
2
3
4
5
-1
1 2 3 4 5
実験4: 関数delete
ソースコードのひな型
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* next;
};
/* 実験 1 で作成 */
void printList( struct node* head ){
/* 内容は自分で作る */
}
/* 実験 3 で作成 */
void append( struct node* head, int x ){
/* 内容は実験テキストを参照 */
}
/* 実験 4 で作成 */
void delete( struct node* head ) {
/* 内容は自分で作る */
}
int main(void){
struct node* head, *p;
/* 最初にダミーノードを用意しておく */
head = (struct node*) malloc(sizeof(struct node));
head->next = NULL;
append( head, 16 );
append( head, 28 );
append( head, 100 );
printf("== 初期状態 ==\n");
printList( head );
printf("\n== delete 1 回目 ==\n");
delete( head );
printList( head );
printf("\n== delete 2 回目 ==\n");
delete( head );
printList( head );
printf("\n== delete 3 回目 ==\n");
delete( head );
printList( head );
printf("\n== delete 4 回目 ==\n");
delete( head );
printList( head );
/* 確保したメモリを解放する */
while (head) {
p = head->next;
free(head);
head = p;
}
return 0;
}
実行例
$ ./a.out
== 初期状態 ==
16 28 100
== delete 1 回目 ==
16 28
== delete 2 回目 ==
16
== delete 3 回目 ==
== delete 4 回目 ==
*** エラー: リストは空です ***