トリッキーコードネット トップへ戻る   C/C++, Java, Perl, PHP, JavaScript, アルゴリズム, ショートコーディング, IOCCCコードの解説, 等々

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> データ構造 >>  サンプルコード - simple-linked-list.c

simple-linked-list.c

ここでの説明のサンプルソースコードです。
(※ リストへのノード追加時にソートを行う関数(listSortAdd)を使用している為、g_tailポインタを使用していません^^;)

※ このコード中には、あえて1箇所、バグを修正せずに放置してある部分があります。何処だか分かりますか~~??

HTML装飾コード

#include <stdio.h>
#include <stdlib.h> // for malloc(), free()
#include <string.h> // for memset(), strlen()
#include "simple-linked-list.h"

node * g_head;

/*
 リストの表示
*/
void displayList()
{
    node * tmp = g_head;

    while (tmp) {
        printf("[%d] %s\n", tmp -> nId, tmp -> pszName);
        tmp = tmp -> next;
    }
}

/*
 新規ノードの作成

 return : 成功 - 作成されたnodeのポインタ / 失敗 - NULL
*/
node * makeNode()
{
    node * n;
    int  nId, nLen;
    char buff[100];

    // 新規ノードの作成
    if ( ! (n = (node *)malloc(sizeof(node))) ) {
        return NULL;
    }

    memset(buff, '', sizeof(buff));

    puts("IDを入力して下さい。->");
    scanf("%d", &nId);

    if (listSearch(nId)) {
        printf("[%d]のIDは既に登録されています。\n", nId);
        return NULL;
    }

    puts("名前を入力して下さい。->");
    fflush(stdin);
    fgets(buff, 100, stdin);
    nLen = strlen(buff);
    buff[nLen - 1] = ''; // 文字列最後の改行を削除

    if ( ! (n -> pszName = (char *)malloc(nLen)) ) { // 文字列最後のNULL文字分を考慮し、(nLen + 1)とする必要はない。
        free(n);
        return NULL;
    }

    // 新規ノードへIDをセット
    n -> nId = nId;

    // 新規ノードへ名前をセット
    memset(n -> pszName, '', nLen);
    strcpy(n -> pszName, buff);

    // 新規ノードのリンクを初期化
    n -> next = NULL;

    return n;
}

/*
 連結リストへID順にソートしながら追加  (この場合 g_tailがいらない)

 add    : 追加するノード
 return : 成功 - 0 / 失敗(重複IDを入力した等) - 1
*/
int listSortAdd(node * add)
{
    node * tmp, * prev;

    if (! add) {
        return 1;
    }

    if (! g_head) {
        // 1つもノードが登録されていない場合
        g_head = add;
    }
    else {
        prev = NULL;
        tmp  = g_head;
        while (tmp) {

            if (tmp -> nId > add -> nId) {

                if (tmp == g_head) {
                    // リストの先頭に登録
                    add -> next = g_head;
                    g_head = add;
                }
                else {
                    // リストの中間に登録
                    prev -> next = add;
                    add  -> next = tmp;
                }

                break;
            }

            prev = tmp;
            tmp  = tmp -> next;
        }

        if (! tmp) {
            // リストの末尾に登録
            prev -> next = add;
        }
    }

    return 0;
}

/*
 リストの検索

 nSearchId : 検索するID
 return    : 探し出したノード
*/
node * listSearch(int nSearchId)
{
    node * tmp = g_head;

    while (tmp) {
        if (tmp -> nId == nSearchId) {
            return tmp;
        }
        tmp = tmp -> next;
    }

    return NULL;
}

/*
 リストの削除

 nDeleteId : 削除するID
 return    : 成功 - 0 / 失敗(該当IDを持つノードがない) - 1
*/
int listDelete(int nDeleteId)
{
    node * prev, * tmp;

    prev = NULL;
    tmp  = g_head;

    while (tmp) {
        if (tmp -> nId == nDeleteId) {

            if (tmp == g_head) {
                // 削除対象ノードがリストの先頭
                g_head = g_head -> next;
            }
            else if (! tmp ->next) {
                // 削除対象ノードがリストの末尾
                prev -> next = NULL;
            }
            else {
                // 削除対象ノードがリストの中間
                prev -> next = tmp -> next;
            }

            free(tmp -> pszName);
            free(tmp);

            return 0;
        }
        prev = tmp;
        tmp  = tmp -> next;
    }

    return 1;
}

/*
 連結リストの初期化(全削除)を行う
*/
void listInit()
{
    node * tmp, * del;

    if (g_head) {
        tmp = g_head;

        while (tmp) {
            del = tmp;
            tmp = tmp -> next;

            free(del -> pszName);
            free(del);
        }
    }

    g_head = NULL;
}

プレーンテキストコード

#include <stdio.h>
#include <stdlib.h> // for malloc(), free()
#include <string.h> // for memset(), strlen()
#include "simple-linked-list.h"

node * g_head;

/*
 リストの表示
*/
void displayList()
{
    node * tmp = g_head;

    while (tmp) {
        printf("[%d] %s\n", tmp -> nId, tmp -> pszName);
        tmp = tmp -> next;
    }
}

/*
 新規ノードの作成

 return : 成功 - 作成されたnodeのポインタ / 失敗 - NULL
*/
node * makeNode()
{
    node * n;
    int  nId, nLen;
    char buff[100];

    // 新規ノードの作成
    if ( ! (n = (node *)malloc(sizeof(node))) ) {
        return NULL;
    }

    memset(buff, '\0', sizeof(buff));

    puts("IDを入力して下さい。->");
    scanf("%d", &nId);

    if (listSearch(nId)) {
        printf("[%d]のIDは既に登録されています。\n", nId);
        return NULL;
    }

    puts("名前を入力して下さい。->");
    fflush(stdin);
    fgets(buff, 100, stdin);
    nLen = strlen(buff);
    buff[nLen - 1] = '\0'; // 文字列最後の改行を削除

    if ( ! (n -> pszName = (char *)malloc(nLen)) ) { // 文字列最後のNULL文字分を考慮し、(nLen + 1)とする必要はない。
        free(n);
        return NULL;
    }

    // 新規ノードへIDをセット
    n -> nId = nId;

    // 新規ノードへ名前をセット
    memset(n -> pszName, '\0', nLen);
    strcpy(n -> pszName, buff);

    // 新規ノードのリンクを初期化
    n -> next = NULL;

    return n;
}

/*
 連結リストへID順にソートしながら追加  (この場合 g_tailがいらない)

 add    : 追加するノード
 return : 成功 - 0 / 失敗(重複IDを入力した等) - 1
*/
int listSortAdd(node * add)
{
    node * tmp, * prev;

    if (! add) {
        return 1;
    }

    if (! g_head) {
        // 1つもノードが登録されていない場合
        g_head = add;
    }
    else {
        prev = NULL;
        tmp  = g_head;
        while (tmp) {

            if (tmp -> nId > add -> nId) {

                if (tmp == g_head) {
                    // リストの先頭に登録
                    add -> next = g_head;
                    g_head = add;
                }
                else {
                    // リストの中間に登録
                    prev -> next = add;
                    add  -> next = tmp;
                }

                break;
            }

            prev = tmp;
            tmp  = tmp -> next;
        }

        if (! tmp) {
            // リストの末尾に登録
            prev -> next = add;
        }
    }

    return 0;
}

/*
 リストの検索

 nSearchId : 検索するID
 return    : 探し出したノード
*/
node * listSearch(int nSearchId)
{
    node * tmp = g_head;

    while (tmp) {
        if (tmp -> nId == nSearchId) {
            return tmp;
        }
        tmp = tmp -> next;
    }

    return NULL;
}

/*
 リストの削除

 nDeleteId : 削除するID
 return    : 成功 - 0 / 失敗(該当IDを持つノードがない) - 1
*/
int listDelete(int nDeleteId)
{
    node * prev, * tmp;

    prev = NULL;
    tmp  = g_head;

    while (tmp) {
        if (tmp -> nId == nDeleteId) {

            if (tmp == g_head) {
                // 削除対象ノードがリストの先頭
                g_head = g_head -> next;
            }
            else if (! tmp ->next) {
                // 削除対象ノードがリストの末尾
                prev -> next = NULL;
            }
            else {
                // 削除対象ノードがリストの中間
                prev -> next = tmp -> next;
            }

            free(tmp -> pszName);
            free(tmp);

            return 0;
        }
        prev = tmp;
        tmp  = tmp -> next;
    }

    return 1;
}

/*
 連結リストの初期化(全削除)を行う
*/
void listInit()
{
    node * tmp, * del;

    if (g_head) {
        tmp = g_head;

        while (tmp) {
            del = tmp;
            tmp = tmp -> next;

            free(del -> pszName);
            free(del);
        }
    }

    g_head = NULL;
}
         このエントリーをはてなブックマークに追加   


作業効率化・ライフハックのオススメ記事




コンピュータ・テクノロジーのオススメ記事





恋愛・人間関係のオススメ記事




※ 当サイトは、トップページからリンクで辿る事の出来るページに限り、リンクフリーです。
※ 当サイトの閲覧/利用によって生じた如何なる損害も、当サイト管理人は責任を負いません。
※ 当サイトの内容を転載される場合は、当サイトへのリンクをお願い致します。