ポインタの概念を理解するには、リンクリスト構造を使ったプログラムを書くことが良いらしい。
なので書いてみた。
###書いたコード
#include <stdio.h>
#include <stdlib.h>
typedef struct List List;
struct List
{
int number;
List* next;
};
List* addListNotFirst(List* list, List* newList);
List* addList(List* list, int n);
List* displayList(List* list);
void deleteAll(List* list);
int main(void)
{
List *list;
list = NULL;
list = addList(list, 30);
list = addList(list, 33);
list = addList(list, 35);
list = addList(list, 36);
list = addList(list, 38);
list = displayList(list);
deleteAll(list);
return 0;
}
List* addListNotFirst(List* list, List* newList)
{
List* first = list;
while(list->next != NULL){
list = list->next;
}
list->next = newList;
return first;
}
List* addList(List* list, int n)
{
List* newList;
newList = malloc(sizeof(List));
newList->number = n;
newList->next = NULL;
if(list == NULL){
list = newList;
return list;
}
return addListNotFirst(list, newList);
}
List* displayList(List* list)
{
List* first = list;
while(list != NULL){
printf("%d\n",list->number);
list = list->next;
}
return first;
}
void deleteAll(List* list)
{
List* tmp;
while(list != NULL){
tmp = list->next;
free(list);
list = tmp;
}
}
##他の人が書いたコードの一部を見て気づいたこと。
#####参考にしたコード
リスト構造をC言語プログラムの実例を用いて解説 | だえうホームページ
https://daeudaeu.com/programming/c-language/list-structure/
#####【振り返り用:最初に自分が書いたコード】リンクリスト構造を使った数字のリスト
https://qiita.com/Kchan_01/private/25ce654df5115cbfa0e1
#####最初、変なwhile文の使い方していた
List* displayList(List* list)
{
List* first = list;
while(1){
if(list != NULL){
printf("%d\n",list->number);
list = list->next;
} else {
break;
}
}
return first;
}
#####変数宣言が関数の頭に来ていなかった
そもそも使わない変数を宣言していることがキモチワルイ。関数をわけて使わない変数を宣言しないようにした。
List* addList(List* list, int n)
{
if(list == NULL){
list = addListFirst(list,n);
return list;
}
List* first = list;
List* tmp;
while(1){
if(list != NULL){
tmp = list;
list = list->next;
} else {
list = malloc(sizeof(List));
list->number = n;
tmp->next = list;
break;
}
}
return first;
}
#####リスト内のポインタ初期化してなかった
List* addListFirst(List* list, int n)
{
list = malloc(sizeof(List));
list->number = n;
// 追記したコード
list->next = NULL;
return list;
}
###参考
リスト構造の操作
http://www.cs.shinshu-u.ac.jp/Lecture/Prog2/9/list-ope.html