Linked List 를 이용한 문법생성

//for compiler project. Linked List Ver 1.3 edited by muzie

#include
#include
#define MAX 100 // 생성조건 S-> ? 넌터미널과 터미널로 이루어진 배열공간 입력을 위한 매크로
///////////////// 리스트를 위한 구조체 ///////////////////////////////////////////////////////////////
typedef struct _node
{
char key;
struct _node *next;
}node;


node *head,*tail;

/////////////////////// 여기까지 리스트를 위한 구조체 //////////////////////////////////////////////////


///////////////////////////////// 여기서부터 링크드 리스트에 관한 함수 /////////////////////////////////

void init_list(void) //초기화
{
head=(node*)malloc(sizeof(node)); // 메모리 할당.
tail=(node*)malloc(sizeof(node)); // 메모리 할당.
head->next=tail; // 머리다음 꼬리.
tail->next=tail; // 꼬리 다음 꼬리.
}

node *find_node(char k) // 키값을 받아서 그 키값이 어디있는지 주소를 반환하는 함수.
{
node *s; // 빈노드를 생성.
s=head->next; // 빈노드가 머리 다음을 가리키게 함.
while(s->key!=k&&s!=tail) // s의 키값이 k 가 아니거나 s가 꼬리에 도달하기 전까지 반복.
s=s->next; // s의 다음 노드를 계속 검색.
return s; // 찾은 s의 주소값을 반환.
}

node *insert(char k)
{
node *s;
node *p;
p=head;
s=p->next;
if(head->next==tail)
{
s=(node *)malloc(sizeof(node));
p->next=s;
s->key=k;
p->next=s;
s->next=tail;
return 0;
}

else
{
while(s!=tail){
p=p->next;
s=s->next;
}
s=(node *)malloc(sizeof(node));
s->key=k;
p->next=s;
s->next=tail;

return s;
}
}

void printnode(){
node *p;
p=head->next;

printf("\n■■■ 현재까지의 문자열 ☞【 ");
for(p=head->next;p!=tail;p=p->next)
{
printf("%c",p->key);


}
printf(" 】\n");
// 머리부터 꼬리 직전까지 프린트한다.
}

int delete_befor(){
node *p;
node *s;
p=head;
s=p->next;

if(p->next == tail) {printf("ERR.Empty List\n");
return 0;}

else {
while(s->next!=tail)
{
p=p->next;
s=s->next;
}

p->next=s->next;
free(s);
return 1;
}

}

int it_is_endmission(){

node *p;
p=head;

while(p->next!=tail)
p=p->next;

if(p->key == 'e') return 3; // 마지막이 e이면 1을 리턴 종료.
else if(p->key == 'A') return 1;
else if(p->key == 'B') return 2;
else return 0; //
}

////////////////////////////////////// 여기까지 리스트에 관한 함수들 ////////////////////////////////////

/////////////////////////////// 문자열 생성에 관여하는 함수부분 ////////////////////////////////////////
int Select_gen1(int n)
{
int cnt;
char aA[MAX]={'a','A'};
char bB[MAX]={'b','B'};
char e='e';
int loop;


if(n==4){ // 생성조건을 입력 받는다. S를 입력했을때. 터미널과 넌터미널을 입력.
scanf("%s",bB);
for(cnt=0;bB[cnt]!=NULL;cnt++);

}

switch(n)
{
case 1: delete_befor(); // S 삭제.
for(cnt=0;aA[cnt]!=NULL;cnt++);
for(loop=0;loop break;

case 2: delete_befor();
for(cnt=0;bB[cnt]!=NULL;cnt++);
for(loop=0;loop break;

case 3: delete_befor();
*insert(e); // 입실론 입력.
break;
}

if(n==1) {printf("\n▩▩▩ List에 aA를 입력하였습니다.\n");
printnode();
printf("\n▩▩▩ 생성규칙 A -> bS에 의해 List에 bS를 입력합니다.\n");
return it_is_endmission();
}
else if(n==2) {printf("\n▩▩▩ List에 bB를 입력하였습니다.\n");
printnode();
printf("\n▩▩▩ 생성규칙 B -> aS에 의해 List에 aS를 입력합니다.\n");
return it_is_endmission();
}
else if(n==3) {printf("\n▩▩▩ List에 e을 입력하였습니다.\n");
return it_is_endmission();
}
else if(n==4) {printf("\n▩▩▩ 새로운 생성규칙을 입력합니다.\n");
return it_is_endmission();
}
return 0;
}

int Select_gen2(int n)
{

int loop,cnt;

char bS[MAX]={'b','S'};
char aS[MAX]={'a','S'};


switch(n) {
case 1: delete_befor();
for(cnt=0;bS[cnt]!=NULL;cnt++);
for(loop=0;loop printnode();
break;

case 2: delete_befor();
for(cnt=0;aS[cnt]!=NULL;cnt++);
for(loop=0;loop printnode();
break;
default : break;
}

return 0;

}


//////////////////////////////////////////// 여기까지 ///////////////////////////////////////////////

///////////////////////////////// 메인 함수 시~작 ///////////////////////////////////////////////////////


void main()
{

char start='S';
int num;
int ret;

printf("▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩\n▩▩▩ S -> aA|bB|e(입실론) ▩▩▩\n▩▩▩ A -> bS ▩▩▩\n▩▩▩ B -> aS ▩▩▩\n▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩\n\n");

init_list();

printf("\n▩▩▩ 문자열 생성을 시작합니다.\n");
printf("\n▩▩▩ 시작하려면 S를 입력하십시오.\n");

for(;;){
printf("▩▩▩ ");
scanf("%c",&start);
printf("\n");
if(start=='S') {*insert(start); break;}
continue;
} ///////////// 스트링 생성 시작.

printf("\n▩▩▩ 시작 S(non terminal)로부터 스트링이 생성됩니다.\n");
printf("\n▩▩▩ 현재 입력되어있는 스트링입니다. :\n");
printnode();

for(;;){ ////////// 입실론이 입력되기 전까지 계속해서 돈다.

printf("\n▩▩▩ 생성 조건을 입력하시오.\n\n\n");
printf("▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩\n▩▩▩ 1. aA ▩▩▩\n▩▩▩ 2. bB ▩▩▩\n▩▩▩ 3. e ▩▩▩\n▩▩▩ 4. 새로운 생성 조건 입력. ▩▩▩\n▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩\n");
printf("▩▩▩ ");
scanf("%d",&num);

switch(ret = Select_gen1(num)){
case 1: Select_gen2(1);
continue;

case 2: Select_gen2(2);
continue;

case 3: printf("▩▩▩ e이 검색되었으므로 스트링 생성을 종료합니다.");
break;

case 4: Select_gen2(4);
continue;
}
printnode();
break; // 스트링 출력.
}
}
////////////////////////////////////////////////////////////////////////////
/// 1. S입력. ->입력 시작.
/// 2. aA와 bB와 e중 입력 택일.
/// 2.1 aA 선택시
/// List -> S삭제, a입력 , A입력.
/// A삭제 -> b입력, S입력. -> 1번으로.
/// 2.2 bB 선택시
/// List -> S삭제, b입력 , B입력.
/// B삭제 -> a입력, S입력. -> 1번으로.
/// 2.3 e 선택시.
/// List -> S삭제. e입력. 루프 이탈.
/// 3. List의 모든 입력된 수 출력.
/// 4. 프로그램 종료.
////////////////////////////////////////////////////////////////////////////

by muzie | 2007/03/30 11:57 | STUDY | 트랙백 | 덧글(0)

트랙백 주소 : http://muzie.egloos.com/tb/3082873
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶