일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ajax
- 베트남어
- 스킨 스쿠버
- Lift
- 메일왕창보내는법
- 명사 뽑아내기
- 도커
- php thumbnail
- ejb
- 주식이야기
- express for node.js
- 명사 분석기
- Eclipse
- 나의 프로젝트
- 나의 취미
- 책이야기
- 디즈니씨
- docker
- iBatis
- ror실행
- C/C++
- flex3
- Cross
- node.js web framework
- Node.js
- php
- scala
- nodejs express
- rss
- 명사 추출기
- Today
- Total
nkdk의 세상
포인터를 이용한 linked struct 본문
이번 주간은 갑자기 c언어네요. 에고에고~ 포인터를 이중으로 이용해서 linked struct를 구현해 봤습니다. 많은 도움이 되실지 모르겠네요. node에 대한 개념을 잘 잡으시면 될거 같네요. 이쪽 공부하고는 완전 담 쌓았더니 엄청 오래 걸렸습니다. 그런데 앞으로 이 기술이 필요 한가 모르겠네요. 그래도 알고 있으면 좋으니까. 쭈욱 나갑니다.
저 같은 경우는 비쥬얼 스튜디어 2005에서 작업 하였습니다. ^^
#include <stdafx.h>
#define ON 1
#define OFF 0
struct node {
char name[20];
int data;
struct node *link;
};
void free_node();
void ins_search(struct node **p, struct node **q, int d);
void ins_link(struct node *p, struct node *q, int s, char *name);
void del_search(struct node **p, struct node **q, int d);
void del_link(struct node *p, struct node *q);
// char convert(char str);
struct node *head, *get_node();
void main() {
int i=0;
int data, sw;
char name[20];
char opcode, inp_string[5];
struct node *p, *q;
void ins_search(), del_search(), ins_link(), del_link();
head = get_node();
sw=ON;
while(sw) {
printf("\n insert code(I:insert, D:delete, Q:quit, p:Print): ");
scanf("%s", inp_string);
/* input value */
opcode = inp_string[0];
printf("** Opcode = %c \n", opcode);
switch(toupper(opcode)) {
case 'I':
printf("\n Enter a name insert: ");
scanf("%s", name);
printf("\n Enter a number insert: ");
scanf("%d", &data);
printf("Inserted Data = %s %d\n", name, data);
ins_search(&p, &q, data);
ins_link(p, q, data, name);
break;
case 'D':
if(head->link != NULL) {
printf("\n Enter a number to delete: ");
scanf("%d", &data);
printf("Inserted Data=%d \n", data);
del_search(&p, &q, data);
if(p==NULL && q==NULL)
printf("Can not find %d in the list\n", data);
else {
del_link(p, q);
printf("Removed Data=%d\n", data);
}
}
else
printf("Empty List \n");
break;
case 'Q':
sw=OFF;
break;
case 'P':
p=head->link;
printf("no name data\r\n");
printf("------------------\r\n");
while(p != NULL) {
i +=1;
printf("%2d %+10s %3d\n", i, p->name, p->data);
p=p->link;
}
if(i==0) printf(" file not found ");
i=0;
printf("\n");
break;
default:
printf("\n *** Warning: error code. \n");
break;
}
}
}
/*
char convert(char str)
{
if(str=65 && str<=90)
str=tolower(str);
else if(str>=97 && str<=122)
str=toupper(str);
return str;
}
*/
struct node *get_node() {
struct node *p;
p=(struct node *) malloc(sizeof (struct node));
p->link=NULL;
return(p);
}
void free_node(struct node *p) {
free(p);
}
void ins_link(struct node *p, struct node *q, int s, char *name) { //s는 삽입될 데이터로 p와 q사이에 삽입
struct node *x;
x=get_node();
x->data=s;
printf("%d", sizeof(name));
for(int i=0;i<20;i++)
x->name[i]=name[i];
if(p == NULL) //맨 앞에 삽입
head->link=x;
else
p->link=x;
x->link=q;
}
void del_link(struct node *p, struct node *q) { //p노드 다음의 q노드를 삭제한다.
if(p==NULL) //맨 앞의 노드삭제
head->link = q->link;
else //중간 노드의 삭제
p->link = q->link;
free_node(q);
}
void ins_search(struct node **p, struct node **q, int d) { //삽입을 위한 검색
if(head->link == NULL) { //empty List의 경우
*p=NULL;
*q=NULL;
}
else {
*q = head->link;
if((*q)->data > d) { //맨 앞에 삽입
*p = NULL;
*q = head->link;
}
else {
*p = head->link;
*q=(*p)->link;
while(((*q) != NULL) && ((*q)->data < d)) {
*p = *q;
*q = (*q)->link;
}
}
}
}
void del_search(struct node **p, struct node **q, int d) { //삭제를 위한 검색
if(head->link == NULL) {
printf("empty list \n");
*p = NULL;
*q = NULL;
}
else {
if(d == head->link->data) {
*p = NULL;
*q = head->link;
}
else {
*p = head->link;
*q = (*p)->link;
while((*q != NULL) && ((*q)->data != d)) {
*p = *q;
*q = (*q)->link;
}
if((*q) == NULL) {
*p = NULL;
*q = NULL;
}
}
}
}
아 힘듭니다.