[ create a new paste ] login | about

Link: http://codepad.org/fzhn6sgi    [ raw code | fork ]

C, pasted on Jan 23:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>


//構造体の定義。
struct c_list {
	char ch; //格納文字。
	struct c_list *pnext; //次のデータのポインタ。
};


//プロトタイプ宣言。
void addhead(struct c_list newlist);
void addtail(struct c_list newlist);
void removeall();
struct c_list removetail();
struct c_list removehead();
struct c_list getat(int n);
void setat(int n, struct c_list newdata);
void removeat(int n);
int getcount();
int empty();
void insertafter(int n, struct c_list newdata);
void insertbefore(int n, struct c_list newdata);
int finddata(struct c_list data);
struct c_list getnext();
void getheadposition();


//リストの最初と最後のデータのポインタ。
struct c_list *pstart, *pend;
struct c_list *ptr;


//メイン関数。
int main(void) {
	struct c_list data;
	char ch;

	//リスト作成。
	ch = getche();
	while( isalpha(ch) ) {
		data.ch = ch;
		addtail(data);
		ch = getche();
	}

	//改行。
	printf("\n");

	//リスト表示。
	getheadposition();
	do {
		data = getnext();
		if( data.ch ) {
			putch(data.ch);
		}
	} while( data.ch );

	printf("\n");

	//確保した領域を開放する。
	removeall();

	return 0;
}


//リストの最後に追加。
void addtail(struct c_list newlist) {
	struct c_list *ptr;

	//メモリー確保。
	ptr = (struct c_list*)malloc(sizeof(struct c_list));

	//現在の最後のデータにアドレス格納。
	if( pend ) {
		pend->pnext = ptr;
	} else {
		pstart = ptr;
	}
	pend = ptr;

	//データをコピー。
	*pend = newlist;

	//追加したデータの次のポインタをNULLにする。
	pend->pnext = NULL;
}


//リストの最初に追加。
void addhead(struct c_list newlist) {
	struct c_list *ptr;

	//メモリー確保。
	ptr = (struct c_list*)malloc(sizeof(struct c_list));

	//データをコピー。
	*ptr = newlist;

	//追加するデータの次のポインタを、現在の最初のデータにする。
	ptr->pnext = pstart;

	//最初のデータを、今追加したデータに置き換える。
	pstart = ptr;
}


//全てのデータを解放する。
void removeall(void) {
	struct c_list *p, *pnext;

	//1つずつ削除していく。
	for( p = pstart; p; p = pnext ) {
		pnext = p->pnext;
		free(p);
	}

	//リストの開始、終了位置をNULLにする。
	pend = pstart = NULL;
}


//最初のデータを削除する。
//返り値として、最初のデータを返す。
struct c_list removehead(void) {
	struct c_list ret;

	//構造体の中身をNULLで初期化する。
	ret.ch = '\0';

	//リストの要素が空でなければ。
	if( pstart ) {

		//最初のデータ取得。
		ret = *pstart;

		//最初のデータを解放する。
		free(pstart);

		//最初のデータを次のデータに置き換える。
		pstart = ret.pnext;

		//空になったらpendも修正。
		if( !pstart ) {
			pend = NULL;
		}
	}

	ret.pnext = NULL;

	return ret;
}


//最後のデータを削除する。
//返り値として、最後のデータを返す。
struct c_list removetail(void) {
	struct c_list ret;

	//返り値用構造体をNULLで初期化する。
	ret.ch = '\0';

	//リストの要素が空でなければ。
	if( pend ) {
		struct c_list *ptr;

		//最後のデータ取得。
		ret = *pend;

		//最後から2番目のpnextを変更する。
		for( ptr = pstart; ptr; ptr = ptr->pnext ) {
			
			//最後から2番目のデータなら。
			if( ptr->pnext == pend ) {
				//pnextをNULLに変更。
				ptr->pnext = NULL;
			}
		}

			//最後のデータを解放する。
			free(pend);

			//最後のデータを、その前のデータに置き換える。
			pend = ptr;

			//空になったらpstartも書き換える。
			if( !pend ) {
				pstart = NULL;
			}
	}

		ret.pnext = NULL;

		return ret;
}


//n番目のデータを返す。
struct c_list getat(int n) {
	struct c_list *ptr;
	struct c_list ret;

	//返り値用データをNULLで初期化する。
	ret.ch = '\0';
	ret.pnext = NULL;

	//nがマイナスはありえない。
	if( n < 0 ) {
		return ret;
	}

	//n番目の要素を返す。
	for( ptr = pstart; ptr; ptr = ptr->pnext ) {
		if( n-- == 0 ) {
			return *ptr;
		}
	}

	//n番目の要素がない場合。
	return ret;
}


//n番目の要素を置き換える。
void setat(int n, struct c_list newdata) {
	struct c_list *ptr;
	struct c_list *pnext;

	//nがマイナスはありえない。
	if( n < 0 ) {
		return;
	}

	for( ptr = pstart; ptr; ptr = ptr->pnext ) {
		if( n-- == 0 ) {
			pnext = ptr->pnext;
			*ptr = newdata;
			ptr->pnext = pnext;
			return;
		}
	}
}


//n番目の要素を削除する。
void removeat(int n) {
	struct c_list *ptr, *ppre;

	//nがマイナスはありえない。
	if( n < 0 ) {
		return;
	}

	//0番目だったら、removeheadを呼び出して帰る。
	if( n == 0 ) {
		removehead();
		return;
	}

	//リストが空だったら。
	if( !pstart ) {
		return;
	}

	//準備。
	ppre = pstart;
	ptr = pstart->pnext;
	n--;

	while( ptr ) {
		//削除。
		if( n-- == 0 ) {
			//リストのつなぎ換え。
			ppre->pnext = ptr->pnext;

			//n番目のリストを解放する。
			free(ptr);

			return;
		}

		ppre = ptr;
		ptr = ptr->pnext;
	}

	//n番目をない場合はここに来る。
}


//リストの要素数を返す。
int getcount(void) {
	struct c_list *ptr;
	int n = 0;

	//空でない場合。
	if( pstart ) {
		for( ptr = pstart; ptr; ptr = ptr->pnext ) {
			n++;
		}
	}

	return n;
}


//リストが空かどうかを調べる。
//返り値:0 ---> 空ではない。
//   :0以外-> 空である。
int empty(void) {
	return pstart ? 0 : 1;
}


//n番目の次に要素を追加する。
void insertafter(int n, struct c_list newdata) {
	struct c_list *ptr, *pnew;

	//nがマイナスはありえない。
	if( n < 0 ) {
		return;
	}

	for( ptr = pstart; ptr; ptr = ptr->pnext ) {
		//指定要素なら。
		if( n-- == 0 ) {
			//メモリ確保。
			pnew = (struct c_list*)malloc(sizeof(struct c_list));

			//新しく確保したメモリにデータをコピーする。
			*pnew = newdata;

			//リストのつなぎ換え。
			pnew->pnext = ptr->pnext;
			ptr->pnext = pnew;

			return;
		}
	}
	//n番目のデータがなければここに来る。
}


//n番目の前に要素を追加する。
void insertbefore(int n, struct c_list newdata) {
	struct c_list *ptr, *pnew;

	//nがマイナスはありえない。
	if( n < 0 ) {
		return;
	}

	//最初に追加するなら、addheadを読んで帰る。
	if( n == 0 ) {
		addhead(newdata);
		return;
	}

	for( ptr = pstart; ptr; ptr = ptr->pnext ) {
		//指定要素なら。
		if( --n == 0 ) {
			//メモリ確保。
			pnew = (struct c_list*)malloc(sizeof(struct c_list));

			//新しく確保したメモリにデータをコピーする。
			*pnew = newdata;

			//リストのつなぎ換え。
			*pnew = newdata;

			//リストのつなぎ換え。
			pnew->pnext = ptr->pnext;
			ptr->pnext = pnew;

			return;
		}
	}

	//n番目のデータがなければここに来る。
}


//要素を探し出す。
//見つからなければ-1を返す。
int finddata(struct c_list data) {
	struct c_list *ptr;
	int i = 0;

	for( ptr = pstart; ptr; ptr->pnext ) {
		//見つかったら。
		if( data.ch == ptr->ch ) {
			return i;
		}
		i++;
	}

	//見つからなかったら。
	return -1;
}


//順次アクセス。
//現在のデータをptrで保存しておき、この関数が呼ばれるたびに次のデータを返すようにする。
struct c_list getnext(void) {
	struct c_list ret;

	//初期化。
	ret.ch = '\0';

	if( ptr ) {
		ret = *ptr;
		ptr = ptr->pnext;
	}
	ret.pnext = NULL;

	return ret;
}


//順次アクセス。
//現在のデータをpstartにし、次回のgetnextで最初のデータを返すように初期化する。
void getheadposition(void) {
	ptr = pstart;
}


Create a new paste based on this one


Comments: