<p> #include <stdio.h><br>#include <stdlib.h><br> <br>typedef struct Node<br>{<br> char str[100];// /포함하여 99자<br> Node * next; //다음 노드 가르키는 포인터<br>}Node;<br>Node *head=NULL; //헤드를 전역으로 선언<br> <br>void insert(int c); //위치삽입 함수<br>void del(int c); //삭제함수<br>void move(int c ,int dc); //옮기기 함수<br>void exchange(int c ,int dc); //교환함수<br>void show(int c);//출력함수<br>void playexchange(int c ,int dc);//교환함수에서 실질적으로 돌리는 함수</p><p> </p><p> <br>int main()<br>{<br> int N=0,i=0,dc, c;<br> char a;<br> scanf("%d",&N);<br> if(N<=1000&&N>=1)//1<= N <=1000이아니면 프로그램 종료<br> {<br> while(N!=i) //반복문이다.<br> {<br> scanf(" %c",&a); //실행할 함수<br> scanf("%d",&c); //원하는 위치<br> <br> switch(a)<br> {<br> case 'I':<br> {<br> insert(c);<br> break;<br> }<br> case 'D':<br> {<br> del(c);<br> break;<br> }<br> case 'M':<br> {<br> scanf("%d",&dc); // c에서 dc로 옮기는 것이다.<br> move(c,dc);<br> break;<br> }<br> case 'E':<br> {<br> scanf("%d",&dc); //c노드와 dc노드를 교환<br> exchange(c,dc);<br> break;<br> }<br> case 'S':<br> {<br> show(c);<br> break;<br> }<br> }<br> i+=1;<br> }<br> }<br> else<br> {<br> return -1;<br> }<br> <br> <br> return 0;<br>}<br> <br> <br>void insert(int c)<br>{<br> <br> Node* m = head; //m에 head를 복사해놓음<br> Node* p;<br> int n;<br> Node * r = (Node*)malloc(sizeof(Node)); //동적할당<br> r->next=NULL; //초기화<br> scanf("%s",&r->str); //값 입력<br> if(head== NULL) //head가 비어있을시에 헤드에 삽입<br> {<br> head = r; <br> } <br> else if(c<=1) //헤드가 삽입되었을때 헤드에 넣고 기존헤드는 다음노드에 삽입하기.<br> {<br> r->next=head;<br> head=r;<br> } <br> else// 넣을 위치에 앞노드 p를 이용해 묶는다.<br> {<br> for(n=0; n<c-1; n++) <br> {<br> p=m;<br> m=m->next;<br> }<br> r->next = p->next;<br> p->next=r;<br> }<br> <br> <br>}<br> <br>void show(int c)<br>{<br> int n=1;<br> Node * m;<br> m = head;<br> while( n!=c) //c번 반복<br> {<br> m = m->next; <br> n++;<br> }<br> printf("%s\n",m->str); //반복후에 그 노드의 값을 출력<br>}<br> <br>void del(int c)<br>{<br> Node *m = head;<br> Node *p;<br> Node *s;<br> int n;<br> if(c>1)<br> { <br> for(n=0; n<c-1; n++) <br> {<br> s=m;<br> m=m->next;<br> }<br> p=m;<br> s->next = m->next; //전 노드와 앞노드 묶기<br> free(p);<br> }<br> else if(c==1) //헤드를 삭제할경우 헤드 앞에 노드가 없기에 위와는 다름 형식이된다.<br> {<br> p =head->next; //헤드의 다음노드 저장<br> free(head);//헤드 날림<br> head = p; //헤드에 저장한 p를 붙이기<br> <br> }<br>}<br> <br>void move(int c,int dc)<br>{<br> Node* m = head;<br> Node* s,*y,*x,*ny,*nx;<br> <br> int n=1;<br> if(c==1) //헤드자리노드를 다른 자리로 옮길시 함수<br> {<br> <br> for(n=0; n < dc-1; n++)<br> {<br> s=m;<br> m=m->next;<br> }<br> y = head;<br> head = head->next; //헤드를 한칸 앞당김<br> s->next = y;<br> y->next = m; //s와 m사이에 헤드노드 삽입<br> }<br> else if(dc == 1) //다른 자리 노드를 헤드에 옮길시<br> {<br> for(n=0; n < c-1; n++)<br> {<br> s=m;<br> m=m->next;<br> }<br> y = head;<br> x = m;<br> head = m;//헤드에 다른자리노드 복사<br> s->next = m->next;//다른자리노드의 부재를 메꾼다.<br> m->next = y;//다른자리 노드 다음노드를 월레헤드로 연결<br> <br> }<br> else<br> {<br> while(m->next!=NULL)<br> {<br> n++;<br> s=m;<br> m=m->next;<br> if(n==c)<br> {<br> y = s;<br> x = m; //옮길 자리 노드의 앞노드와 그 자체노드를 따로 복사<br> }<br> if(n==(dc-1))<br> {<br> ny = m;<br> nx = m->next; //옮겨질위치 자리 노드의 앞노드와 그 자체노드를 따로 복사<br> }<br> }<br> y->next = x->next;<br> ny->next = x;<br> x->next = nx;//c노드를 cd노드의 앞 ny - c - nx이런식으로 삽입한다.<br> }<br> <br>}<br> <br>void exchange(int c ,int dc)<br>{<br> Node* m = head;<br> Node* s,*o,*k,*y,*x,*ny,*nx;<br> <br> int n=1;<br> if(c==1)<br> {<br> playexchange(c ,dc);<br> <br> }<br> else if(dc == 1)<br> {<br> playexchange(dc ,c);<br> <br> }<br> else<br> {<br> while(m->next!=NULL)<br> {<br> n++;<br> s=m;<br> m=m->next;<br> if(n==c)<br> {<br> y = s;<br> x = m; //교환할 1번 노드 앞노드와 그 자체노드 복사<br> }<br> if(n==dc)<br> {<br> ny = s;<br> nx = m; //교환할 2번 노드 앞노드와 그 자체노드 복사<br> }<br> }<br> k=x;<br> o=nx;<br> y->next = nx;<br> ny->next = x;<br> nx->next = k->next;<br> x->next = o->next;//두 노드를 교환 정보가 엉키지않게 차례를 조율한다.<br> <br> }<br>}<br> <br>void playexchange(int c ,int dc)<br>{<br> int n;<br> Node *m = head;<br> Node *s,*k,*y;<br> for(n=0; n < dc-1; n++)<br> {<br> s=m;<br> m=m->next;<br> }<br> k = m;<br> y = head;<br> s->next = head; <br> m->next = k->next;<br> head = k;<br> k->next = y->next;//앞노드가 없는 헤드자리에 노드와 다른자리의 노드를 교환한다. c와 dc둘중 하나가 1이면 파라매터를 바꾸어서 넣으면 되기에 둘의 함수가 같다.<br> <br>}</p><p> </p><p>이거 과제로 컴퓨터가 체점하는건데 돌리니까 70퍼센트 맞았다고 뜨네요....명세서에 있는 예시대로 쳐보면 맞게 나오는데 대체 왜이러는걸까여......2시간 남았는데 죽고 싶지않습니다</p><p> </p><p> </p><p> </p><p>------------------명세서 에요,,,-=---------------------------</p><p> </p><p>연결된 리스트를 사용하여 다음과 같은 라인 편집기를 만들고자 한다. 이 편집기에서 지원되는 연<br>산은 삽입(Insert), 삭제 ,이동(Move), 교환(Exchange), 보기(Show) 다섯 개이고, 이들은 모<br>두 라인(line) 단위로 수행된다.<br>각 연산에 대한 구체적인 설명은 다음과 같다. 여기서 x는 양의 정수이고, str은 문자열이다.<br>1. 삽입: I x str<br>x번 라인 앞에 문자열 str을 삽입한다. 즉, 삽입 후 str이 x번 라인이 된다. 예를 들어, x가 2이면<br>2번 라인에 str이 삽입되고, 기존의 2번 이후의 라인은 하나씩 뒤로 밀린다.<br>2. 삭제: D x<br>x번 라인을 삭제한다.<br>3. 이동: M x y<br>x번 라인을 y번 라인 앞으로 이동한다. 기존의 y번 이후의 라인은 하나씩 뒤로 밀린다.<br>4. 교환: E x y<br>x번 라인과 y번 라인을 서로 바꾼다.<br>5. 보기: S x<br>x번 라인의 내용을 화면에 출력한다. 화면에 출력하는 유일한 연산이다.<br>예를 들어, 아래 왼쪽 연산들이 차례로 입력된 후, 텍스트의 내용은 오른쪽과 같다.<br>I 1 This_is_line_A.<br>I 1 This_is_line_B.<br>I 3 This_is_line_C.<br>I 3 This_is_line_D.<br>D 3<br>I 1 This_is_line_E.<br>⇨<br>1: This_is_line_E.<br>2: This_is_line_B.<br>3: This_is_line_A.<br>4: This_is_line_C.<br>(보기 쉽게 맨 앞에 라인 번호를 표시함)<br>계속해서 아래 연산이 연이어서 입력될 때, 각 연산 이후의 텍스트 내용은 오른쪽과 같다.<br>M 2 5 ⇨<br>1: This_is_line_E.<br>2: This_is_line_A.<br>3: This_is_line_C.<br>4: This_is_line_B.<br>(주의!! 이동 후 5번 라인이 아닌 4번 라인이 됨에 유의)<br>M 3 1 ⇨<br>1: This_is_line_C.<br>2: This_is_line_E.<br>3: This_is_line_A.<br>4: This_is_line_B.<br>15<br>E 3 4 ⇨<br>1: This_is_line_C.<br>2: This_is_line_E.<br>3: This_is_line_B.<br>4: This_is_line_A.<br>프로그램이 만족하는 (혹은 만족해야 하는) 가정 및 조건은 다음과 같다. (조건을 만족시키지 않는<br>경우 감점 처리)<br>1. 각 라인은 영문자와 기호들로 이루어져 있으며, 공백이나 탭은 없다. (즉, scanf로 처리하면 됨)<br>2. 한 라인에 저장되는 글자 수는 최대 99자이고, 라인의 총 수에는 제한이 없다.<br>3. 라인 번호는 1번부터 시작한다.<br>4. 텍스트의 내용은 연결 리스트로 유지해야 한다. 텍스트의 한 라인의 내용 연결 리스트의 한 노드<br>에 저장되도록 한다. 연결 리스트의 형태는 단순, 원형, 이중 연결리스트 등 어떤 것이든 상관없다.<br>5. 모든 연산은 리스트 상에서 수행되어야 한다. 예를 들어, 5번 교환연산의 경우, 해당 두 노드에<br>저장된 문자열 값만 서로 바꿔주는 식으로 구현해서는 안 되고, 두 노드 자체를 리스트 상에서 교환<br>해야 한다.<br>위 설명에 따라 동작하는 프로그램을 작성하시오.<br>다음 정보가 표준입력으로 주어진다. 첫째 줄에는 연산의 총 개수 N이 주어진다(1≤N≤1,000).<br>두 번째 줄부터는 연산의 정보가 한 줄에 하나씩 주어진다. 연산의 형식은 위의 설명을 참조하시오.<br>잘못된 연산은 주어지지 않는다. 예를 들어, 현재 라인이 5개 존재할 때, "M 1 7"과 같은 연산은 주<br>어지지 않는다.<br>다음 정보를 표준출력(stdin)으로 출력한다. 보기 연산에 의해 출력되는 정보를 화면에 출력한다.<br>각 줄의 맨 앞과 맨 끝에 공백은 존재하지 않는다.<br>※ 테스트 데이터의 개수: 10개 (아래 입출력 예 2개 포함)<br>※ 테스트 데이터의 분포<br>- 데이터의 30%는 삽입, 보기 연산만 존재<br>- 데이터의 50%는 삽입, 삭제, 보기 연산만 존재<br>- 데이터의 70%는 삽입, 삭제, 이동, 보기 연산만 존재</p>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.