티스토리 뷰
#include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node *link; }Node; Node* createNode(int num) { Node *p; p=(Node*)malloc(sizeof(Node)); p->link=NULL; p->data=num; return p; }
//이전과 동일.
Node* reverse(Node *head) { Node *res,*tmp,*p=head; //결과 저장 res, 임시 저장 tmp //head를 따라가는 포인터 p res=tmp=NULL; while(p!=NULL) { tmp=res; //우선 뒤집을 포인터의 헤드를 따라간다. res=p; //뒤집을 포인터의 헤드로 간다. p=p->link; //뒤집을 포인터의 접근 위치를 다음으로 옮긴다. res->link=tmp;//뒤집을 포인터의 헤드 링크를 뒤집을 포인터에 삽입한다. } return res; //뒤집은 포인터의 결과 리턴 } int main(void) { Node *p,*head; p=head=createNode(10); p->link=createNode(20); p=p->link; p->link=createNode(30); p=p->link; p->link=createNode(40); p=p->link; p->link=createNode(50); printf("역순 연산 전 데이터 : "); for(p=head;p!=NULL;p=p->link) printf("%d -> ",p->data); printf("NULL"); printf("\n\n역순 연산 후 데이터 : "); for(p=reverse(head);p!=NULL;p=p->link) printf("%d -> ",p->data); printf("NULL"); return 0; }
단순 연결 리스트의 역순 연산이다.
먼저 임시 저장 노드(tmp)의 포인터를 결과 주소(res)로 넣어주고
결과 주소를 뒤집을 포인터의 맨 앞 노드로 넣어준다.
그 후 뒤집을 포인터의 맨 앞 노드에 있던 접근 위치(p)를 다음 노드로 옮겨주고
tmp를 임시 저장 노드와 링크시킨다. (물론 tmp->link 형식으로, tmp가 앞에 있다.)
과정
1. 10 > 20 > 30 > 40 > NULL / NULL
2. 20 > 30 > 40 > NULL / 10 > NULL
3. 30 > 40 > NULL / 20 > 10 > NULL
4. 40 > NULL / 30 > 20 > 10 > NULL
5. NULL / 40 > 30 > 20 > 10 > NULL
설명이 빈약해서 아쉽다..
http://toygift7.tistory.com/28
이곳에서 참고해 많은 도움을 얻었으니 이해가 잘 안된다면 열람하면 된다.
'Today I learned > 자료구조' 카테고리의 다른 글
트리(Tree) (0) | 2017.10.11 |
---|---|
단순 연결 리스트 (1, 개념) (0) | 2017.09.19 |