1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C言語 リンクリスト構造を使った数字のリスト

Last updated at Posted at 2020-03-06

ポインタの概念を理解するには、リンクリスト構造を使ったプログラムを書くことが良いらしい。

なので書いてみた。

###書いたコード

#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

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?