Skip to content

Instantly share code, notes, and snippets.

@y-chan
Created June 10, 2019 07:39
Show Gist options
  • Save y-chan/76fc7d0e6ed5aeb7f68afc27dce9da5e to your computer and use it in GitHub Desktop.
Save y-chan/76fc7d0e6ed5aeb7f68afc27dce9da5e to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct slip {
int coinType; //slip-0044 coin type (https://github.com/satoshilabs/slips/blob/master/slip-0044.md)
char coinName[30]; // crypto currrency name (ex. Bitcoin)
char coinSymbol[10]; // crypto currency symbol (ex. BTC)
struct slip *prev;
struct slip *next;
} SLIP;
SLIP *head = NULL;
SLIP *tail = NULL;
SLIP *createNode();
SLIP *addElementsToNode(SLIP *newNode, int inputType, char inputName[30], char inputSymbol[10]);
SLIP *searchNode(SLIP *current, char searchName[30], char searchSymbol[30]);
void addNodeToList(void);
void printList(int allPrint);
void insertNodeToList(int before);
void deleteNodeFromList(void);
int allPrint;
int before;
int main() {
char input;
while (1) {
printf("SLIP-0044一覧化プログラム\n");
printf("1 : リストの末尾にコインデータを追加します。\n");
printf("2 : リスト内のコインデータを全て表示します。\n");
printf("3 : コインデータを入力し、それに該当するものがリスト内にあれば表示します。\n");
printf("4 : リスト内の任意の場所の前にコインデータを挿入します。\n");
printf("5 : リスト内の任意の場所の後にコインデータを挿入します。\n");
printf("6 : リスト内の任意のデータを削除します。\n");
printf("7 : プログラムを終了します。\n");
printf("コマンドを入力してください:");
scanf("%s", &input);
switch (input) {
case '1':
addNodeToList();
break;
case '2':
allPrint = 1;
printList(allPrint);
break;
case '3':
allPrint = 0;
printList(allPrint);
break;
case '4':
before = 1;
insertNodeToList(before);
break;
case '5':
before = 0;
insertNodeToList(before);
break;
case '6':
deleteNodeFromList();
break;
case '7':
return 0;
break;
default:
printf("無効なコマンドです。\n");
break;
}
printf("\n");
}
return 0;
}
SLIP *createNode() {
SLIP *newNode;
newNode = (SLIP *)malloc(sizeof(SLIP));
return newNode;
}
SLIP *addElementsToNode(SLIP *newNode, int inputType, char inputName[30], char inputSymbol[10]) {
newNode = createNode();
printf("SLIP-0044のcointypeを入力(例 0):");
scanf("%d", &inputType);
newNode->coinType = inputType;
printf("通貨名を入力(例 Bitcoin):");
scanf("%s", inputName);
strcpy(newNode->coinName, inputName);
printf("通貨シンボルを入力(例 BTC):");
scanf("%s", inputSymbol);
for(int i = 0;i <= strlen(inputSymbol); i++) {
if(inputSymbol[i] >=97 && inputSymbol[i] <= 122)
inputSymbol[i] = inputSymbol[i] - 32;
}
strcpy(newNode->coinSymbol, inputSymbol);
return newNode;
}
SLIP *searchNode(SLIP *current, char searchName[30], char searchSymbol[30]) {
current = head;
scanf("%s", searchSymbol);
strcpy(searchName, searchSymbol);
for(int i = 0;i <= strlen(searchSymbol); i++) {
if(searchSymbol[i] >=97 && searchSymbol[i] <= 122)
searchSymbol[i] = searchSymbol[i] - 32;
}
while (current != NULL) {
if (strcmp(current->coinName, searchName) == 0 || strcmp(current->coinSymbol, searchSymbol) == 0) {
printf("一致するデータが見つかりました。\n");
break;
} else {
current = current->next;
}
}
return current;
}
void addNodeToList() {
SLIP *newNode, *temp;
int inputType;
char inputName[30];
char inputSymbol[10];
newNode = addElementsToNode(newNode, inputType, inputName, inputSymbol);
if ((head == NULL) && (tail == NULL)) {
newNode->prev = NULL;
head = newNode;
tail = newNode;
} else {
newNode->prev = tail;
tail->next = newNode;
tail = newNode;
}
tail->next = NULL;
printf("データを追加しました。\n");
}
void printList(int allPrint) {
SLIP *current;
char inputCoin[30];
char inputCopy[30];
if ((head == NULL) && (tail == NULL)) {
printf("リストは空です。\n");
return;
}
if (allPrint == 1) {
current = head;
printf("----------------------------------\n");
while (1) {
printf("Coin Type : %d\n", current->coinType);
printf("Coin Name : %s\n", current->coinName);
printf("Coin Symbol : %s\n", current->coinSymbol);
// printf("------------debug data------------\n");
// printf("prev data : %d\n", current->prev);
// printf("current data: %d\n", current);
// printf("next data : %d\n", current->next);
printf("----------------------------------\n");
if (current->next != NULL) {
current = current->next;
} else {
break;
}
}
} else {
printf("データを表示したい通貨名かシンボルを入力: ");
current = searchNode(current, inputCoin, inputCopy);
if (current == NULL) {
printf("データが見つかりませんでした。\n");
} else {
printf("----------------------------------\n");
printf("Coin Type : %d\n", current->coinType);
printf("Coin Name : %s\n", current->coinName);
printf("Coin Symbol : %s\n", current->coinSymbol);
printf("----------------------------------\n");
}
}
}
void insertNodeToList(int before) {
char searchName[30];
char searchSymbol[30];
SLIP *current, *temp, *temp2, *newNode, *after;
int inputType;
char inputName[30];
char inputSymbol[10];
if(before == 1) {
printf("挿入したい後ろの通貨名もしくは通貨シンボルを入力してください\n");
printf("入力されたの通貨名/シンボルを持つデータの前に、新しいデータを挿入します: ");
} else {
printf("挿入したい前の通貨名もしくは通貨シンボルを入力してください。\n");
printf("入力されたの通貨名/シンボルを持つデータの後ろに、新しいデータを挿入します: ");
}
current = searchNode(current, searchName, searchSymbol);
if(before == 1 && current->prev != NULL) {
current = current->prev;
before = 0;
}
if(current == NULL) {
printf("データが見つかりませんでした。\n");
return;
}
newNode = addElementsToNode(newNode, inputType, inputName, inputSymbol);
if(before == 1 && current->prev == NULL) {
newNode->prev = NULL;
newNode->next = current;
head = newNode;
current->prev = newNode;
} else if(current->next == NULL) {
newNode->prev = tail;
tail->next = newNode;
tail = newNode;
} else {
temp = current->next;
temp2 = current;
after = current->next;
current->next = newNode;
newNode->next = temp;
newNode->prev = temp2;
after->prev = newNode;
}
printf("データを挿入しました。\n");
}
void deleteNodeFromList() {
char searchName[30];
char searchSymbol[30];
SLIP *current, *temp, *temp2;
printf("削除する通貨名もしくは通貨シンボルを入力してください: ");
current = searchNode(current, searchName, searchSymbol);
if (current == NULL) {
printf("データが見つかりませんでした。\n");
return;
}
if (current == tail && current == head) {
head = NULL;
tail = NULL;
free(current);
} else if (current == head) {
head = current->next;
head->prev = NULL;
free(current);
} else if (current == tail) {
tail = current->prev;
tail->next = NULL;
free(current);
} else {
temp = current->next;
temp2 = current->prev;
temp->prev = temp2;
temp2->next = temp;
free(current);
}
printf("削除が完了しました。\n");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment