001 /****************************/
002 /* リスト構造 */
003 /* coded by Y.Suganuma */
004 /****************************/
005 #include <stdio.h>
006 #include <string.h>
007
008 /********************/
009 /* クラスListの定義 */
010 /********************/
011 class List
012 {
013 char *st; // データ(文字列)
014 List *next; // 次のデータ
015
016 public :
017 // コンストラクタ
018 List () { next = NULL; }
019
020 List (char *s)
021 {
022 next = NULL;
023 st = new char [strlen(s)+1];
024 strcpy(st, s);
025 }
026
027 void add(List *); // データの追加
028 void del(char *); // データの削除
029 void output(); // 出力
030 };
031
032 /**************************************/
033 /* データの追加 */
034 /* dt : Listクラスのオブジェクト */
035 /**************************************/
036 void List::add(List *dt)
037 {
038 List *lt1, *lt2 = this;
039 int sw = 1;
040
041 while (sw > 0) {
042 // 最後に追加
043 if (lt2->next == NULL) {
044 lt2->next = dt;
045 sw = 0;
046 }
047 // 比較し,途中に追加
048 else {
049 lt1 = lt2;
050 lt2 = lt2->next;
051 int k = strcmp(dt->st, lt2->st); // 比較
052 if (k < 0) { // 追加
053 dt->next = lt2;
054 lt1->next = dt;
055 sw = 0;
056 }
057 }
058 }
059 }
060
061 /*********************/
062 /* データの削除 */
063 /* st1 : 文字列 */
064 /*********************/
065 void List::del(char *st1)
066 {
067 List *lt1, *lt2 = this;
068 int sw = 1;
069
070 while (sw > 0) {
071 // データが存在しない場合
072 if (lt2->next == NULL) {
073 printf(" 指定されたデータがありません!\n");
074 sw = 0;
075 }
076 // 比較し,削除
077 else {
078 lt1 = lt2;
079 lt2 = lt2->next;
080 int k = strcmp(st1, lt2->st); // 比較
081 if (k == 0) { // 削除
082 delete [] lt2->st;
083 lt1->next = lt2->next;
084 sw = 0;
085 }
086 }
087 }
088 }
089
090 /**********************/
091 /* リストデータの出力 */
092 /**********************/
093 void List::output()
094 {
095 List *nt = this->next;
096
097 while (nt != NULL) {
098 printf(" data = %s\n", nt->st);
099 nt = nt->next;
100 }
101 }
102
103 /****************/
104 /* main program */
105 /****************/
106 int main ()
107 {
108 int sw = 1;
109 List base, *lt;
110
111 while (sw > 0) {
112 char st[100];
113 printf("1:追加,2:削除,3:出力,0:終了? ");
114 scanf("%d", &sw);
115 switch (sw) {
116 case 1: // 追加
117 printf(" データを入力してください ");
118 scanf("%s", st);
119 lt = new List(st);
120 base.add(lt);
121 break;
122 case 2: // 削除
123 printf(" データを入力してください ");
124 scanf("%s", st);
125 base.del(st);
126 break;
127 case 3: // 出力
128 base.output();
129 break;
130 default :
131 sw = 0;
132 break;
133 }
134 }
135
136 return 0;
137 }