PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2010/05/01 19:23:24
Name 제로스
Subject C언어 질문입니다 ..
파일로부터 단어를 읽어와서 리스트에 저장한 단어장 프로그램인데요 ..

리스트를 처음 써봐서 너무 코드가 복잡한거 같아서 파쟐 여러분께 도움을 얻을까합니다.

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include <string.h>

#define SIZE 26

typedef struct ListNode{
        char word[SIZE];
        struct ListNode *link;
}ListNode;

void error(char *message){
        fprintf(stderr,"%s\n",message);
        exit(1);
}

ListNode *create_node(char *word,ListNode *link){
        ListNode *new_node;
        new_node=(ListNode *)malloc(sizeof(ListNode));
        if( new_node == NULL )
                error("메모리 할당 에러");
        strcpy(new_node->word,word);
        new_node->link=link;
        return (new_node);
}

void insert(ListNode **phead,ListNode **other,ListNode *node,int *num){
        ListNode *p,*q;
        q=node;
        if( *phead == NULL ){
                *phead=node;
                node->link=node;
                (*num)++;
        }
        else{
                p=*phead;
                do{
                        if(strcmp(p->word,q->word)==0){
                                return;
                        }
                        p=p->link;
                }while(p!=*phead);
        }
        p=*other;
        if( *other != NULL){
                do{
                        if(strcmp(p->word,q->word)==0){
                                return;
                        }
                        p=p->link;
                }while(p!=*other);
        }
        
        if( *phead != NULL ){
                node->link=(*phead)->link;
                (*phead)->link=node;
                (*num)++;
        }
}


void display(ListNode *head,int k){
        ListNode *p;
        if( head==NULL )
                return ;
        p=head;
        printf("%c\n",(char)k+65);
        do{
                printf("%s ",p->word);
                p=p->link;
        }while(p!=head);
        printf("\n\n");
}

void search(ListNode *head,ListNode *other,char *searchWord){
        ListNode *p;

        p=head;
        do{
                if(strcmp(p->word,searchWord)==0){
                        printf("단어장에 있습니다.\n");
                        return;
                }
                p=p->link;
        }while(p!=head);
        p=other;
        do{
                if(strcmp(p->word,searchWord)==0){
                        printf("단어장에 있습니다.\n");
                        return;
                }
                p=p->link;
        }while(p!=other);
        printf("단어장에 없습니다.\n");
        return;
}

int main(){
        ListNode *alphabet[SIZE];
        ListNode *theOthers=NULL;

        int choice;
        int i,j,k;
        int num[SIZE];
        char ch;
        char str[SIZE];
        char searchWord[SIZE];

        FILE *file=fopen("c:\\sample.txt","r");
    FILE *file1=fopen("c:\\sample1.txt","w");
    if(file==NULL || file1==NULL){
                printf("file open error!\n");
        return 1;
    }

        while(!feof(file)){
                ch=fgetc(file);
        if(isalpha(ch)==0)
                        ch=' ';
                else
                        ch=toupper(ch);
        fputc(ch,file1);
        }

        fclose(file);
        fclose(file1);

        file1=fopen("c:\\sample1.txt","r");
        if(file1==NULL){
                printf("file1 open error!\n");
                return 1;
        }

        for(i=0;i<26;i++){
                alphabet[i]=NULL;
        }
        for(i=0;i<26;i++){
                num[i]=1;
        }
        
        while(!feof(file1)){
                fscanf(file1,"%s",str);
                k=(int)str[0];
                if(num[k-65]<=6)
                        insert(&alphabet[k-65],&theOthers,create_node(str,NULL),&num[k-65]);
                else
                        insert(&theOthers,&alphabet[k-65],create_node(str,NULL),&num[k-65]);
        }

        fclose(file1);
        
        for(i=0;i<26;i++){
                display(alphabet[i],i);
        }

        display(theOthers,100);

        while(1){
                printf("┌────────────┐\n");
                printf("│기능을 선택하세요       │\n");
                printf("│[1] Search   [2] Insert │\n");
                printf("│[3] Delete   [4] Quit   │\n");
                printf("└────────────┘\n");
                printf(" :");
                scanf("%d",&choice);
        
                switch(choice){
                        case 1:
                                printf("찾을 단어를 입력하세요.: ");
                                scanf("%s",searchWord);
                                for(j=0;j<strlen(searchWord);j++)
                                        searchWord[j]=toupper(searchWord[j]);
                                k=(int)searchWord[0];
                                search(alphabet[k-65],theOthers,searchWord);
                                break;
                        case 2:
                                printf("추가할 단어를 입력하세요.: ");
                                scanf("%s",searchWord);
                                for(j=0;j<strlen(searchWord);j++)
                                        searchWord[j]=toupper(searchWord[j]);
                                k=(int)searchWord[0];
                                if(num[k-65]<=5)
                                        insert(&alphabet[k-65],&theOthers,create_node(searchWord,NULL),&num[k-65]);
                                else
                                        insert(&theOthers,&alphabet[k-65],create_node(searchWord,NULL),&num[k-65]);
                                break;
                }
        }
}


우선 검색,삽입까지는 구현했는데.. 삭제를 구현하는게 힘드네요.

여러번 시도해봤는데 계속 안되서... 어떤방향으로 해야할지 조언을 얻으려고합니다..

코드가 많이 복잡해서 알아보시기 힘드실거 같아 죄송합니다..

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
彌親男
10/05/01 21:53
수정 아이콘
주석의 중요성.txt

약간의 설명만 좀 해주시면 안될까요.. ㅠㅠ
10/05/01 23:01
수정 아이콘
삭제는 반드시 순서를 지켜야 합니다. 안그러면 연결을 못시키고 나머지 메모리가 붕 뜨니까요.

1. prev(이전 노드의 주소를 기록할 노드)와 current(지워야 할 노드...탐색시 도착 위치) 포인터 변수를 생성합니다.

이 포인터 변수는 현재 위치의 노드가 가진 주소를 가르킬 변수 입니다.

2. 탐색해갑니다. 다음 노드로 가기전에 현재 거친 노드를 prev로 지정합니다.

3. 지워야 할 메모리에 도착했다면 current가 가르키는 링크(즉 다음 노드의 위치)를 prev가 가르키게 합니다.

이럼 지워야 할 노드와 그 앞의 노드가 지워야 할 노드의 다음 노드를 가르키게 되어 링크가 완성 됩니다.

4. current 노드를 지웁니다.

이렇게 하면 올바른 삭제가 됩니다. 대충 프로그래밍 하실 줄 아시니까 이 정도의 설명이면 도움이 되실 겁니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
80600 박찬호 선수에 대한 질문입니다.. [121] Psy_Onic-0-3714 10/05/01 3714
80599 C언어 질문입니다 .. [3] 제로스1997 10/05/01 1997
80598 PGR에서 활동하시는 공중보건의 분들 많으신가요? [4] 세뚜아2082 10/05/01 2082
80597 어버이날선물 Psychedelia2122 10/05/01 2122
80596 소녀시대 윤아의 존댓말 질문요 [17] Dr.No4186 10/05/01 4186
80595 노..논산 훈련소 편지 질문입니다. [11] 소녀시대김태2325 10/05/01 2325
80594 경주 관광코스 추천부탁드립니다. Leon2829 10/05/01 2829
80593 창원에서 야구배울곳 찾습니다~ 너만을사랑해2099 10/05/01 2099
80592 엠비씨 게임 광고중에서 [1] 나백수..2109 10/05/01 2109
80591 스타 픽션 질문 라누1769 10/05/01 1769
80590 저프전 9오버풀을 할 때; [7] Mutalism4174 10/05/01 4174
80589 푸시업 맨손 운동 질문입니다. [11] 승뢰2475 10/05/01 2475
80588 영화를 찾습니다. [3] 캠퍼1944 10/05/01 1944
80587 등산화 잘 아시는 분 계시면 알려주세요~ [2] Je ne sais quoi2168 10/05/01 2168
80586 넷북과 노트북에 관한.. [4] Wow2141 10/05/01 2141
80585 [제안 또는 건의] 차단 기능의 필요성에 대해서 [14] 엘룬연금술사1721 10/05/01 1721
80584 40대 중반의 부모님 결혼기념일 선물 추천 좀 해주세요. [3] 박보영♡9139 10/05/01 9139
80583 한국 프로야구 레전드 스토리가 야갤에서 연재되면 어떻게 될까요? [6] 유니콘스2312 10/05/01 2312
80582 스타 연습상대좀 해주실 테란분 계신가요? [7] 김라울2248 10/05/01 2248
80580 노래 추천 부탁드립니다! 데스2141 10/05/01 2141
80579 축구 시합 및 장소 섭외 관련 조언 부탁드립니다 [1] 레몬막걸리1918 10/05/01 1918
80578 공유기 설정창 접속 질문입니다. [1] 오토모빌굿1924 10/05/01 1924
80577 미국 토지법의 기록에 대한 질문입니다. Roro1957 10/05/01 1957
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로