#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;
}
*/
0 件のコメント:
コメントを投稿