2014/02/19

リスト作成 02/20

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_STRING 256
#define CMD_MAX_LINE 5
#define TRUE 1
#define FALSE -1

struct list *add_list(char dataStr[MAX_STRING], struct list *header);
struct list *del_list(int key, struct list *header);
int std_list(struct list *listPointer);
int strToKey(char dataStr[MAX_STRING]);

struct list{
    int key;
    char name[MAX_STRING];
    struct list *next;
};
struct data{
    int dKey;
    char dName[MAX_STRING];
};

struct data list_A={1,"Aさん"};
struct data list_B={2,"Bさん"};
struct data list_C={3,"Cさん"};
struct list dList[3]={
    {1,"Aさん",},
    {2,"Bさん",},
    {3,"Cさん",},
};
char cmd_Add[CMD_MAX_LINE] = "add";
char cmd_Del[CMD_MAX_LINE] = "del";
char cmd_List[CMD_MAX_LINE] = "list";

int main()
{
    char str[MAX_STRING] = {NULL};
    char cmd[CMD_MAX_LINE] = {NULL};
    char data[MAX_STRING] ={NULL};
    struct list *header;
    struct list *pList;
    int key = 0;
    int i,j;
    int brank = FALSE;
   
    header = NULL;

    while(str[0] != '0'){
        /*初期化*/
        for(i = 0; i< MAX_STRING;i++){
            str[i] = NULL;
        }
        for(i = 0; i< CMD_MAX_LINE;i++){
            cmd[i] = NULL;
        }
        /* メニュー表示 */
        printf("[menu]\n");
        printf("cmd:add_*\n");
        printf("cmd:del_*\n");
        printf("cmd:list_all\n");
        printf("End:0\n");

        /* 入力 */
        scanf("%s",&str);

        /* コマンド検知 */
        for(i = 0;i < MAX_STRING; i++){
            if(str[i] == '_'){
                brank = i;
            }
        }
        /* 終了処理 */
        if(str[0] == '0'){
            printf("終了します。\n");
            break;
        }
        else if(brank == FALSE){
            printf("コマンドが違います。\n");
        }
        else{
            /* コマンド格納 */
            for(i = 0;i < brank; i++){
                cmd[i] = str[i];
            }
            /* 対象データの格納 */
            printf("data[i] = ");
            for(i = 0, j = brank + 1 ;str[i] != '\0'; i++,j++){
                data[i] = str[j];
                printf("%c",data[i]);
            }
            data[i] = '\0';
            printf("\n");
        }
        printf("cmd = %s\n",cmd);
        printf("data = %s\n",data);
        if(strcmp(cmd,cmd_Add) == 0){
            //printf("add:\n");
            header = add_list(data,header);
        }
        else if(strcmp(cmd,cmd_Del) == 0){
            printf("del:\n");
            key = strToKey(data);
            header = del_list(key,header);
        }
        else if(strcmp(cmd,cmd_List) == 0){
            //printf("list:\n");
            std_list(header);
        }
        else if(cmd[0] == '0'){
            printf("終了\n");
        }
        else{
            printf("もう一度入力してください。\n");
        }
    }
    return 0;
}
struct list *add_list(char dataStr[MAX_STRING], struct list *header){

    struct list *pList;
    /* 領域確保 */
    if ((pList = (struct list *) malloc(sizeof(struct list))) == NULL) {
        printf("malloc error\n");
        exit(EXIT_FAILURE);
    }
    /* リストにデータを登録 */
    if(strcmp(dataStr,"A") == 0){
        pList->key = list_A.dKey;
        strcpy(pList->name, list_A.dName);
    }
    else if(strcmp(dataStr,"B") == 0){
        pList->key = list_B.dKey;
        strcpy(pList->name, list_B.dName);
    }
    else if(strcmp(dataStr,"C") == 0){
        pList->key = list_C.dKey;
        strcpy(pList->name, list_C.dName);
    }
    else{
        printf("そのようなデータは持ち合わせておりません。\n");
    }

    /* ポインタのつなぎ換え */
    pList->next= header;    /* 今までの先頭ポインタを次ポインタに */
    header = pList;            /* 新たな領域を先頭ポインタに */
   
    return header;
}

struct list *del_list(int key, struct list *header){

    struct list *pList;
    struct list *last_pList;

    pList = header;
    last_pList = header;

    /* キーをサーチする */
    while(pList != NULL) {
        if(key == pList->key){ //キーが一致
            /* header(先頭)のキーが一致したら、次のポインタをheaderに指定する*/
            if(pList == header){
                header = pList->next;
            }
            /* 1つ前のポインタのあて先を現在参照しているデータの次のあて先を指定する*/
            else{
                last_pList->next = pList->next;
            }
            free( pList );
            return header;
        }
        last_pList = pList;   //1つ前のポインタを記録する
        pList = pList->next; //キーが見つかるか、NULLまで進める
    }
    printf( "キー%dが見つかりません\n", key );
    return header;
}

/* リスト表示関数 */
int std_list(struct list *listPointer){

    printf("-------------\n");
    while (listPointer != NULL) {    /* 次ポインタがNULLまで処理 */
        printf("[%d] Name:%s\n", listPointer->key, listPointer->name);
        listPointer = listPointer->next;
    }
    printf("-------------\n");
    return 0;
}
/* 文字列からKEYを特定する */
int strToKey(char dataStr[MAX_STRING]){

    if(strcmp(dataStr,"A") == 0){
        return list_A.dKey;
    }
    else if(strcmp(dataStr,"B") == 0){
        return list_B.dKey;
    }
    else if(strcmp(dataStr,"C") == 0){
        return list_C.dKey;
    }
    return FALSE;
}

0 件のコメント:

コメントを投稿