
001	/****************************/
002	/* 単方向リスト             */
003	/*      coded by Y.Suganuma */
004	/****************************/
005	#include <stdio.h>
006	#include <time.h>
007	#include "MT.h"
008	
009	/********************/
010	/* クラスListの定義 */
011	/********************/
012	class List
013	{
014			int data;
015			List *next;
016		public :
017				// コンストラクタ
018			List () { next = NULL; }
019	
020			List (int x)
021			{
022				next = NULL;
023				data = x;
024			}
025	
026			void add(List *);   // データの追加
027			void del(int);   // データの削除
028			void get(int, int[]);   // データの参照
029			void output();   // 出力
030	};
031	
032	List root;
033	
034	/********************/
035	/* データの追加     */
036	/*      dt : データ */
037	/********************/
038	void List::add(List *dt)
039	{
040		List *lt1, *lt2 = &root;
041		int sw = 0;
042	
043		while (sw == 0) {
044				// 最後に追加
045			if (lt2->next == NULL) {
046				lt2->next = dt;
047				sw        = 1;
048			}
049				// 比較し,途中に追加
050			else {
051				lt1 = lt2;
052				lt2 = lt2->next;
053				if (dt->data <= lt2->data) {   // 比較
054					dt->next  = lt2;
055					lt1->next = dt;
056					sw        = 1;
057				}
058			}
059		}
060	}
061	
062	/***********************/
063	/* データの削除        */
064	/*      x : 削除データ */
065	/***********************/
066	void List::del(int x)
067	{
068		List *lt1, *lt2 = &root;
069		int sw = 0;
070	
071		while (sw == 0) {
072				// データが存在しない場合
073			if (lt2->next == NULL) {
074				printf("   ***error*** データがありません!(del)\n");
075				sw = 1;
076			}
077				// 比較し,削除
078			else {
079				lt1 = lt2;
080				lt2 = lt2->next;
081				if (x == lt2->data) {   // 比較
082					lt1->next = lt2->next;   // 削除
083					sw        = 1;
084				}
085			}
086		}
087	}
088	
089	/*************************/
090	/* データの参照          */
091	/*      n : データの位置 */
092	/*************************/
093	void List::get(int n, int x[])
094	{
095		List *lt = &root;
096		x[0] = -1;
097		x[1] = -1;
098				// n 番目のデータ参照
099		if (lt->next != NULL) {
100			int k = 1;
101			while (lt->next != NULL) {
102				lt = lt->next;
103				if (k == n) {
104					x[0] = lt->data;
105					if (lt->next != NULL) {
106						lt   = lt->next;
107						x[1] = lt->data;
108					}
109					break;
110				}
111				else
112					k++;
113			}
114		}
115		if (x[0] < 0)
116			printf("***error*** データが存在しません!(get)\n");
117	}
118	
119	/**********************/
120	/* リストデータの出力 */
121	/**********************/
122	void List::output()
123	{
124		if (next == NULL)
125			printf("   データがありません(output)\n");
126		else {
127			List *lt = next;
128			printf("   data");
129			while (lt != NULL) {
130				printf(" %d", lt->data);
131				lt = lt->next;
132			}
133			printf("\n");
134		}
135	}
136	
137	/****************/
138	/* main program */
139	/****************/
140	int main ()
141	{
142				// 初期設定;
143		init_genrand((unsigned)time(NULL));
144		root.output();
145				// 追加1
146		int k = (int)(1000 * genrand_real3());
147		printf("%d を追加\n", k);
148		List *dt = new List(k);
149		root.add(dt);
150		root.output();
151				// 追加2
152		k = (int)(1000 * genrand_real3());
153		printf("%d を追加\n", k);
154		dt = new List(k);
155		root.add(dt);
156		root.output();
157				// 追加3
158		k = (int)(1000 * genrand_real3());
159		printf("%d を追加\n", k);
160		dt = new List(k);
161		root.add(dt);
162		root.output();
163				// 削除1
164		printf("%d を削除\n", k);
165		root.del(k);
166		root.output();
167				// 追加4
168		k = (int)(1000 * genrand_real3());
169		printf("%d を追加\n", k);
170		dt = new List(k);
171		root.add(dt);
172		root.output();
173				// 参照
174		int *x = new int [2];
175		for (int i1 = 0; i1 < 5; i1++) {
176			root.get(i1, x);
177			if (x[0] > 0) {
178				printf("%d 番目のデータは %d\n", i1, x[0]);
179				if (x[1] > 0)
180					printf("   %d 番目(後ろ)のデータは %d\n", i1+1, x[1]);
181				else
182					printf("   (後ろ)***error*** データが存在しません!(get)\n");
183				if (i1 == 1)
184					printf("   (前)");
185				root.get(i1-1, x);
186				if (x[0] > 0)
187					printf("   %d 番目(前)のデータは %d\n", i1-1, x[0]);
188			}
189		}
190		return 0;
191	}
			
データがありません(output) 441 を追加 data 441 176 を追加 data 176 441 949 を追加 data 176 441 949 949 を削除 data 176 441 636 を追加 data 176 441 636 ***error*** データが存在しません!(get) 1 番目のデータは 176 2 番目(後ろ)のデータは 441 (前)***error*** データが存在しません!(get) 2 番目のデータは 441 3 番目(後ろ)のデータは 636 1 番目(前)のデータは 176 3 番目のデータは 636 (後ろ)***error*** データが存在しません!(get) 2 番目(前)のデータは 441 ***error*** データが存在しません!(get)

001	/****************************/
002	/* 双方向リスト             */
003	/*      coded by Y.Suganuma */
004	/****************************/
005	#include <stdio.h>
006	#include <time.h>
007	#include "MT.h"
008	
009	/********************/
010	/* クラスListの定義 */
011	/********************/
012	class List
013	{
014			int data;
015			List *next;
016			List *prev;
017		public :
018				// コンストラクタ
019			List () {
020				next = NULL;
021				prev = NULL;
022			}
023	
024			List (int x)
025			{
026				next = NULL;
027				prev = NULL;
028				data = x;
029			}
030	
031			void add(List *);   // データの追加
032			void del(int);   // データの削除
033			void get(int, int[]);   // データの参照
034			void output();   // 出力
035	};
036	
037	List root;
038	
039	/********************/
040	/* データの追加     */
041	/*      dt : データ */
042	/********************/
043	void List::add(List *dt)
044	{
045		List *lt1 = NULL, *lt2 = &root;
046		int sw = 0;
047	
048		while (sw == 0) {
049				// 最後に追加
050			if (lt2->next == NULL) {
051				lt2->next = dt;
052				sw        = 1;
053				if (lt2 != &root)
054					dt->prev = lt2;
055			}
056				// 比較し,途中に追加
057			else {
058				lt1 = lt2;
059				lt2 = lt2->next;
060				if (dt->data <= lt2->data) {   // 比較
061					dt->next  = lt2;
062					lt1->next = dt;
063					lt2->prev = dt;
064					sw        = 1;
065					if (lt1 != &root)
066						dt->prev = lt1;
067				}
068			}
069		}
070	}
071	
072	/***********************/
073	/* データの削除        */
074	/*      x : 削除データ */
075	/***********************/
076	void List::del(int x)
077	{
078		List *lt1, *lt2 = &root;
079		int sw = 0;
080	
081		while (sw == 0) {
082				// データが存在しない場合
083			if (lt2->next == NULL) {
084				printf("   ***error*** データがありません!(del)\n");
085				sw = 1;
086			}
087				// 比較し,削除
088			else {
089				lt1 = lt2;
090				lt2 = lt2->next;
091				if (x == lt2->data) {   // 比較
092					lt1->next = lt2->next;   // 削除
093					lt2->prev = lt1;
094					sw        = 1;
095				}
096			}
097		}
098	}
099	
100	/*************************/
101	/* データの参照          */
102	/*      n : データの位置 */
103	/*************************/
104	void List::get(int n, int x[])
105	{
106		List *lt = &root;
107		x[0] = -1;
108		x[1] = -1;
109		x[2] = -1;
110				// n 番目のデータ参照
111		if (lt->next != NULL) {
112			int k = 1;
113			while (lt->next != NULL) {
114				lt = lt->next;
115				if (k == n) {
116					x[0] = lt->data;
117					if (lt->next != NULL) {
118						List *lt1 = lt->next;
119						x[1]      = lt1->data;
120					}
121					if (lt->prev != NULL) {
122						List *lt1 = lt->prev;
123						x[2]      = lt1->data;
124					}
125					break;
126				}
127				else
128					k++;
129			}
130		}
131		if (x[0] < 0)
132			printf("***error*** データが存在しません!(get)\n");
133	}
134	
135	/**********************/
136	/* リストデータの出力 */
137	/**********************/
138	void List::output()
139	{
140		if (next == NULL)
141			printf("   データがありません(output)\n");
142		else {
143			List *lt = next, *wk = NULL;
144			printf("   data(順)");
145			while (lt != NULL) {
146				printf(" %d", lt->data);
147				wk = lt;
148				lt = lt->next;
149			}
150			printf("\n");
151	
152			lt = wk;
153			printf("   data(逆)");
154			while (lt != NULL) {
155				printf(" %d", lt->data);
156				lt = lt->prev;
157			}
158			printf("\n");
159		}
160	}
161	
162	/****************/
163	/* main program */
164	/****************/
165	int main ()
166	{
167				// 初期設定;
168		init_genrand((unsigned)time(NULL));
169		root.output();
170				// 追加1
171		int k = (int)(1000 * genrand_real3());
172		printf("%d を追加\n", k);
173		List *dt = new List(k);
174		root.add(dt);
175		root.output();
176				// 追加2
177		k = (int)(1000 * genrand_real3());
178		printf("%d を追加\n", k);
179		dt = new List(k);
180		root.add(dt);
181		root.output();
182				// 追加3
183		k = (int)(1000 * genrand_real3());
184		printf("%d を追加\n", k);
185		dt = new List(k);
186		root.add(dt);
187		root.output();
188				// 削除1
189		printf("%d を削除\n", k);
190		root.del(k);
191		root.output();
192				// 追加4
193		k = (int)(1000 * genrand_real3());
194		printf("%d を追加\n", k);
195		dt = new List(k);
196		root.add(dt);
197		root.output();
198				// 参照
199		int *x = new int [2];
200		for (int i1 = 0; i1 < 5; i1++) {
201			root.get(i1, x);
202			if (x[0] > 0) {
203				printf("%d 番目のデータは %d\n", i1, x[0]);
204				if (x[1] > 0)
205					printf("   %d 番目(後ろ)のデータは %d\n", i1+1, x[1]);
206				else
207					printf("   (後ろ)***error*** データが存在しません!(get)\n");
208				if (x[2] > 0)
209					printf("   %d 番目(前)のデータは %d\n", i1-1, x[2]);
210				else
211					printf("   (前)***error*** データが存在しません!(get)\n");
212			}
213		}
214		return 0;
215	}
			データがありません(output) 866 を追加 data(順) 866 data(逆) 866 899 を追加 data(順) 866 899 data(逆) 899 866 240 を追加 data(順) 240 866 899 data(逆) 899 866 240 240 を削除 data(順) 866 899 data(逆) 899 866 240 0 497 を追加 data(順) 497 866 899 data(逆) 899 866 497 ***error*** データが存在しません!(get) 1 番目のデータは 497 2 番目(後ろ)のデータは 866 (前)***error*** データが存在しません!(get) 2 番目のデータは 866 3 番目(後ろ)のデータは 899 1 番目(前)のデータは 497 3 番目のデータは 899 (後ろ)***error*** データが存在しません!(get) 2 番目(前)のデータは 866 ***error*** データが存在しません!(get)

01	/****************************/
02	/* 木構造                   */
03	/*      coded by Y.Suganuma */
04	/****************************/
05	#include <iostream>
06	#include <string>
07	#include <vector>
08	
09	using namespace std;
10	
11	/********************/
12	/* クラスListの定義 */
13	/********************/
14	class List
15	{
16			string data;
17			List *parent;
18			vector <List *> children;
19		public :
20				// コンストラクタ   p: 親に対するポインタ
21			List (string x, List *p)
22			{
23				parent = p;
24				data   = x;
25				if (parent != NULL)
26					(parent->children).push_back(this);
27			}
28	
29			void output();   // 出力
30	};
31	
32	/****************/
33	/* データの出力 */
34	/****************/
35	void List::output()
36	{
37		cout << data << endl;
38		if (children.size() > 0) {
39			cout << "   子供";
40			for (int i1 = 0; i1 < (int)children.size(); i1++)
41				cout << " " << children[i1]->data << "(親" << (children[i1]->parent)->data << ")";
42			cout << endl;
43		}
44	
45		for (int i1 = 0; i1 < (int)children.size(); i1++) {
46			if ((children[i1]->children).size() > 0)
47				children[i1]->output();
48		}
49	}
50	
51	/****************/
52	/* main program */
53	/****************/
54	int main ()
55	{
56		List S("S", NULL);
57		List A("A", &S);
58		List B("B", &S);
59		List C("C", &S);
60		List D("D", &A);
61		List E("E", &A);
62		List F("F", &C);
63		List G("G", &C);
64		S.output();
65		return 0;
66	}
			
S 子供 A(親S) B(親S) C(親S) A 子供 D(親A) E(親A) C 子供 F(親C) G(親C)

| 講義内容目次 | 菅沼ホーム | 前ページ | 次ページ |