#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 件のコメント:
コメントを投稿