Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

C 역 연결 리스트를 위한 프로그램

<시간/>

이 문제에서는 연결 목록이 제공됩니다. 우리의 임무는 역방향 연결 리스트를 위한 프로그램을 만드는 것입니다.

프로그램은 주어진 연결 목록을 반대로 하고 역 연결 목록을 반환합니다.

연결된 목록 항목이 포함된 링크의 시퀀스입니다. 각 링크에는 다른 링크에 대한 연결이 포함되어 있습니다.

예시

9 -> 32 -> 65 -> 10 -> 85 -> NULL

역방향 연결 목록은 목록의 링크를 반대로 바꾸어 연결 목록을 구성하기 위해 만든 연결 목록입니다. 연결 리스트의 헤드 노드는 연결 리스트의 마지막 노드가 되고 마지막 노드는 헤드 노드가 됩니다.

예시

위의 연결 리스트로부터 형성된 역연결 리스트 -

85 -> 10 -> 65 -> 32 -> 9 -> NULL

주어진 연결 목록을 뒤집기 위해 우리는 프로세스에 있을 세 개의 추가 포인터를 사용할 것입니다. 포인터는 이전, 이후, 현재가 됩니다.

우리는 이전과 이후를 처음에는 NULL로 초기화하고 현재는 연결 목록의 헤드로 초기화합니다.

그런 다음 초기(역방향 연결되지 않은 연결 목록)의 NULL에 도달할 때까지 반복합니다. 그리고 다음을 수행하십시오 -

<이전> 이후 =현재 -> 다음 현재 -> 다음 =이전 이전 =현재 현재 =이후

이제 연결 리스트를 뒤집는 프로그램을 만들어 봅시다. 프로그램을 만드는 방법에는 두 가지가 있습니다. 하나는 반복적이고 다른 하나는 재귀적입니다.

역방향 연결 목록을 위한 프로그램(꼬리 재귀 접근 방식)

예시

#include struct Node { int data; struct Node* next;};Node* insertNode(int key) { Node* temp =new Node; 임시 -> 데이터 =키; 임시 -> 다음 =NULL; return temp;}void tailRecRevese(노드* 현재, 노드* 이전, 노드** 헤드){ if (!current->next) { *head =현재; 현재->다음 =이전; 반품; } 노드* 다음 =현재->다음; 현재->다음 =이전; tailRecRevese(다음, 현재, 머리);} 무효 tailRecReveseLL(노드** 머리){ if (!head) return; tailRecRevese(*head, NULL, head);}void printLinkedList(Node* head){ while (head !=NULL) { printf("%d ", head->data); 머리 =머리 -> 다음; } printf("\n");}int main(){ 노드* head1 =insertNode(9); head1->next =insertNode(32); 헤드1->다음->다음 =insertNode(65); 헤드1->다음->다음->다음 =insertNode(10); head1->다음->다음->다음->다음 =insertNode(85); printf("연결리스트 :\t"); printLinkedList(head1); tailRecReveseLL(&head1); printf("역연결리스트 :\t"); printLinkedList(head1); 반환 0;}

출력

연결리스트 :9 32 65 10 85역연결리스트 :85 10 65 32 9

역방향 연결 목록을 위한 프로그램(반복적 접근)

예시

#include struct Node { int data; struct Node* 다음; 노드(int 데이터){ this->data =데이터; 다음 =NULL; }};struct LinkedList { 노드* 헤드; LinkedList(){ 머리 =NULL; } 무효 interReverseLL(){ 노드* 현재 =머리; 노드 *이전 =NULL, *이후 =NULL; while (현재 !=NULL) { after =현재->다음; 현재->다음 =이전; 이전 =현재; 현재 =이후; } 머리 =이전; } 무효 print() { 구조체 노드* temp =머리; while (temp !=NULL) { printf("%d ", 임시-> 데이터); 임시 =임시 -> 다음; } printf("\n"); } 무효 푸시(int 데이터){ 노드* 임시 =새로운 노드(데이터); 임시 -> 다음 =머리; 머리 =온도; }};int main() { 링크드리스트 링크드리스트; 링크드리스트.푸시(85); 링크드리스트.푸시(10); 링크드리스트.푸시(65); 링크드리스트.푸시(32); 링크드리스트.푸시(9); printf("연결리스트 :\t"); 링크드리스트.프린트(); 링크드리스트.interReverseLL(); printf("역방향 연결 리스트 :\t"); 링크드리스트.프린트(); 반환 0;}

출력

연결리스트 :9 32 65 10 85역연결리스트 :85 10 65 32 9