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

C++에서 연결 목록의 역순을 인쇄하는 흥미로운 방법

<시간/>

연결 목록은 데이터 요소를 연결 형식으로 저장하는 데이터 구조입니다. 연결 목록의 각 노드에는 데이터 요소와 링크가 있습니다.

연결 목록의 역순 인쇄는 문제 해결에서 해결해야 하는 일반적인 문제입니다. 그래서, 여기서 우리는 C++ 프로그래밍 언어로 연결 리스트의 역순을 출력하는 흥미로운 방법을 배울 것입니다.

일반적으로 역방향 연결 목록을 인쇄하려면 목록을 수정하거나 목록을 여러 번 탐색해야 하지만 이 방법은 그런 것이 필요하지 않으며 연결 목록을 한 번만 탐색합니다.

이 방법의 논리는 캐리지 리턴을 사용하여 문자열을 역으로 인쇄하는 것입니다. 캐리지 리턴은 프린터(디스플레이의 경우 커서)에 라인의 위치를 ​​떠나 화면의 특정 위치로 이동하는 명령입니다. 이제 논리는 인쇄할 목록의 요소를 위한 공간을 남겨두고 n(목록의 길이)을 전진시키는 것입니다. 인쇄할 첫 번째 요소 앞에 n -1 공백이 남아 있어야 합니다. 그런 다음 초에 대해 n-2를 입력하는 식입니다.

이제 개념을 설명하는 프로그램을 살펴보겠습니다.

예시

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
struct Node {
   int data;
   struct Node* next;
};
void printReverse(struct Node** head_ref, int n) ;
void push(struct Node** head_ref, int new_data) ;
int printList(struct Node* head) ;
int main(){
   struct Node* head = NULL;
   push(&head, 2);
   push(&head, 7);
   push(&head, 3);
   push(&head, 5);
   push(&head, 4);
   push(&head, 6);
   printf("Given linked list:\n");
   int n = printList(head);
   printf("\nReversed Linked list:\n");
   printReverse(&head, n);
   return 0;
}
void printReverse(struct Node** head_ref, int n){
   int j = 0;
   struct Node* current = *head_ref;
   while (current != NULL) {
      for (int i = 0; i < 2 * (n - j); i++)
         cout<<" ";
      cout<<current->data<<"\r";
      current = current->next;
      j++;
   }
}
void push(struct Node** head_ref, int new_data){
   struct Node* new_node =
   (struct Node*)malloc(sizeof(struct Node));
   new_node->data = new_data;
   new_node->next = (*head_ref);
   (*head_ref) = new_node;
}
int printList(struct Node* head){
   int i = 0;
   struct Node* temp = head;
   while (temp != NULL) {
      printf("%d ", temp->data);
      temp = temp->next;
      i++;
   }
   return i;
}

출력

Given linked list:
6 4 5 3 7 2
Reversed Linked list:
2 7 3 5 4 6