2014/02/23

リスト構造 #2

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

#define MAX_STRING 256
#define CMD_MAX_LINE 5
#define MAX_DATA 10
#define TRUE 1
#define FALSE -1
#define CMD_ADD "add"
#define CMD_DEL "del"
#define CMD_INSERT "insert"
#define CMD_LIST "list"
#define CMD_END "0"
#define CMD_VALUE_ADD 1
#define CMD_VALUE_DEL 2
#define CMD_VALUE_INSERT 3
#define CMD_VALUE_LIST 4
#define CMD_VALUE_END 0


struct list *add_list(int listDataNum, struct list *header);
struct list *insert_list(int listDataNum, struct list *header);
struct list *del_list(int key, struct list *header);
int std_list(struct list *listPointer);
int strToKey(char dataStr[MAX_STRING]);
int checkCmd(char *str);
int storeData(char *data, int dataNumber);
int countData(char *str);

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

char listData[MAX_DATA][MAX_STRING] ={NULL};
int currentDataNum = 1;

int main()
{
    char str[MAX_STRING] = {NULL};
    char data[MAX_STRING] ={NULL};
    struct list *header;
    int key = 0;
    int i;
    int brank = FALSE;
    int cmdResult = 0;
    int storeResult = 0;
    int countDataResult = 0;

    header = NULL;

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

        /* 入力 */
        fgets(str,sizeof(str),stdin);
        str[strlen(str)-1] = '\0';

        /* コマンド検知 */
        cmdResult = checkCmd(str);
       
        /* データの数の確認 */
        countDataResult = countData(str);

        /* 対象データの格納 */
        storeResult = storeData(str,i);

        /* 該当コマンドへ */
        switch(cmdResult){
            case CMD_VALUE_ADD:
                 for(i = 0;i < countDataResult;i++){
                     header = add_list(i,header);
                 }
                 break;
            case CMD_VALUE_DEL:
                 for(i = 0;i < countDataResult;i++){
                     header = del_list(i,header);
                 }
                 break;
            case CMD_VALUE_INSERT:
                 for(i = 0;i < countDataResult;i++){
                     header = insert_list(i,header);
                 }
                 break;
            case CMD_VALUE_LIST:
                 std_list(header);
                 break;
            case CMD_VALUE_END:
                 printf("終了します。\n");
                 break;
            default:
                 printf("もう一度入力してください。\n");
                 break;
        }
    }
    return 0;
}
/* コマンド検知関数 */
int checkCmd(char *str){

    int i;
    int brank = 0;
    int brankTrue = 0;
    char cmd[MAX_STRING]={NULL};

    printf("CMD\n");

    /* コマンド検知 */
    for(i = 0;i < MAX_STRING; i++){
        if(str[i] == ' ' && brankTrue == 0){
            brank = i;
            brankTrue = 1;
        }
    }
    for(i = 0; i < brank ;i++){
        cmd[i] = str[i];
    }
    printf("cmd:%s\n",cmd);
    if(strcmp(cmd,CMD_ADD) == 0){
        printf("1\n");
        return 1;
    }
    else if(strcmp(cmd,CMD_DEL) == 0){
        printf("2\n");
        return 2;
    }
    else if(strcmp(cmd,CMD_INSERT) == 0){
        printf("3\n");
        return 3;
    }
    else if(strcmp(str,CMD_LIST) == 0){
        printf("4\n");
        return 4;
    }
    else if(strcmp(str,CMD_END) == 0){
        printf("0\n");
        return 0;
    }
    else{
        return FALSE;
    }
}
/* データ数判定関数*/
int countData(char *str){

    int i;
    int dataCount = 0;
   
    for(i = 0;i < MAX_STRING; i++){
        if(str[i] == ' '){
            dataCount++;
        }
    }
    return dataCount;
}


/* データ格納関数 */
int storeData(char *str, int dataNumber){

    int i,j,k = 0;
    int brank[MAX_DATA];
    int brankNum = 0;
    char data[MAX_STRING] = {NULL};

    /* 初期化 */
    memset(listData, NULL, sizeof(listData));
   
    /* 空白の場所を記憶する */
    for(i = 0,j = 0;i < MAX_STRING; i++){
        if(str[i] == ' '){
            brank[j] = i;
            j++;
        }
    }
    brankNum = j;
    printf("brankNum = %d\n",brankNum);
    for(k = 0;k < brankNum;k++){
        for(i = 0, j = brank[k] + 1 ;str[j] != '\0'; i++,j++){
           if(str[j] != ' '){
               listData[k][i] = str[j];
               printf("%c",listData[k][i]);
           }
           else{
           }
        }
    listData[k][i] = '\0';
    }
    printf("\n");
    for(k = 0;k < brankNum;k++){
        printf("listData[%d] = %s\n",k,listData[k]);
    }
    return TRUE;
}

/* リスト追加関数*/
struct list *add_list(int listDataNum, struct list *header){

    struct list *pList;

    /* 領域確保 */
    if ((pList = (struct list *) malloc(sizeof(struct list))) == NULL) {
        printf("malloc error\n");
        exit(EXIT_FAILURE);
    }
    /* リストにデータを登録 */
    pList->key = currentDataNum;
    strcpy(pList->name, listData[listDataNum]);

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

    currentDataNum++;
    return header;
}

struct list *insert_list(int listDataNum, struct list *header){

    struct list *pList, *add_pList;

        /* 新規リストにデータを登録 */
        if ((add_pList = (struct list *)malloc( sizeof( struct list))) == NULL ) {
                printf("malloc ERROR\n");
                exit(EXIT_FAILURE);
        }
        add_pList->key = currentDataNum;
        strcpy(add_pList->name, listData[listDataNum]);

        /* キーが最大のとき */
        if ( header == NULL || currentDataNum > header->key ) {
                /* ポインタのつなぎ換え */
                add_pList->next = header;
                return add_pList;
        }

        /* キーのサーチ */
        for(pList = header;  pList->next != NULL; pList = pList->next){
            if(currentDataNum > pList->next->key ){
                break;
            }
        }
        /* ポインタのつなぎ換え */
        add_pList->next = pList->next;
        pList->next = add_pList;
        return header;
}


/* リスト削除関数*/
struct list *del_list(int listDataNum, struct list *header){

    struct list *pList;
    struct list *last_pList;

    pList = header;
    last_pList = header;

    /* キーをサーチする */
    while(pList != NULL) {
        if(strcmp(listData[listDataNum],pList->name) == 0){ //名前が一致
            /* header(先頭)のキーが一致したら、次のポインタをheaderに指定する*/
            if(pList == header){
                header = pList->next;
                currentDataNum--;
            }
            /* 1つ前のポインタのあて先を現在参照しているデータの次のあて先を指定する*/
            else{
                last_pList->next = pList->next;
                currentDataNum--;
            }
            free( pList );
            return header;
        }
        last_pList = pList;   //1つ前のポインタを記録する
        pList = pList->next; //キーが見つかるか、NULLまで進める
    }
    currentDataNum--;
    printf( "名前が見つかりません\n");
    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;
}
/* リスト追加関数*/
/*
struct list *add_list(int listDataNum, struct list *header){

    struct list *pList;

    /* 領域確保
    if ((pList = (struct list *) malloc(sizeof(struct list))) == NULL) {
        printf("malloc error\n");
        exit(EXIT_FAILURE);
    }
    /* リストにデータを登録
    pList->key = currentDataNum;
    strcpy(pList->name, listData[listDataNum]);

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

    currentDataNum++;
    return header;

}
*/



/* 文字列から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;
}
*/

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;
}

2014/02/16

-作成中-リスト生成

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

#define MAX_STRING 256
#define CMD_MAX_LINE 5

struct list{
    int key;
    char name[MAX_STRING];
    struct list *next;
};
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};
    struct list *header;
    int key = 0;
    int i;

    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\n");
        printf("End:0\n");
        scanf("%s",&str);
        for(i = 0;str[i] != '_'; i++){
            cmd[i] = str[i];
        }
        cmd[i] = '_';
        printf("cmd(str) = %s\n",cmd);

        if(strcmp(cmd,cmd_Add) == 0){
            printf("add:\n");
        }
        else if(strcmp(cmd,cmd_Del) == 0){
            printf("del:\n");
        }
        else if(strcmp(cmd,cmd_List) == 0){
            printf("list:\n");
        }
        else if(cmd[0] == '0'){
            printf("終了\n");
        }
        else{
            printf("もう一度入力してください。\n");
        }
    }
    return 0;
}

2014/02/11

コメントはずし

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

#define TRUE 1
#define FALSE -1
#define STRING_SIZE 256

int startPoint = 0;
int endPoint = 0;

int checkComment(char *);
int stOutput(char *);

int main()
{
    char str[STRING_SIZE];
    int i = 0;
    int comment;

    printf("文字を入力したください。\n");
    scanf("%s",&str);
   
    comment = checkComment(str);
    if(comment == TRUE)
    {
        stOutput(str);
    }
    /*
    for(i = 0; str[i] != NULL; i++)
    {
        printf("%c",str[i]);
    }       
    printf("\n");
    */
    return 0;
}

int checkComment(char *str)
{
    int i = 0;
    int startComment = 0;
    int endComment = 0;
    int checkComment = 0;

    for(i = 0; str[i] != NULL; i++)
    {
        printf("%c",str[i]);
        if(str[i] =='/' && str[i+1] =='*')
        {
            //printf(" /* を発見!!\n");
            startComment = TRUE;
            startPoint = i;
        }
        if(startComment == TRUE && str[i] =='*' && str[i+1] =='/')
        {
            //printf(" */ を発見!!\n");
            endComment = TRUE;
            endPoint = i + 2;
        }
    }
    printf("\n");
    checkComment = startComment * endComment;
    return checkComment;
}

int stOutput(char *str)
{
    int i = 0;
    int j = 0;

    //printf("stOutput\n");

    for(i = 0; i < startPoint; i++)
    {
        printf("%c",str[i]);
    }
    for(j = endPoint; str[j] != NULL ; j++)
    {
        printf("%c",str[j]);
    }
    printf("\n");
    return 0;
}