관리 메뉴

nkdk의 세상

포인터를 이용한 linked struct 본문

My Programing/C/C++/C#/PRO-C

포인터를 이용한 linked struct

nkdk 2008. 6. 3. 18:04

이번 주간은 갑자기 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;
            }
        }
    }
}

아 힘듭니다.