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

C++의 2D 행렬에서 연결 목록 구성


행렬이 하나 있다고 가정하면 재귀 접근 방식을 사용하여 이를 2차원 연결 목록으로 변환해야 합니다.

목록에는 오른쪽 및 아래쪽 포인터가 있습니다.

따라서 입력이 다음과 같으면

10 20 30
40 50 60
70 80 90

그러면 출력은

C++의 2D 행렬에서 연결 목록 구성

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 함수 make_2d_list()를 정의하면 행렬 mat, i, j, m, n,

    가 사용됩니다.
  • i와 j가 행렬 경계에 없으면 -

    • null 반환

  • temp :=값이 mat[i, j]

    인 새 노드 생성
  • temp 오른쪽 :=make_2d_list(mat, i, j + 1, m, n)

  • 온도 감소 :=make_2d_list(mat, i + 1, j, m, n)

  • 반환 온도

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class TreeNode {
   public:
   int data;
   TreeNode *right, *down;
   TreeNode(int d){
      data = d;
      right = down = NULL;
   }
};
void show_2d_list(TreeNode* head) {
   TreeNode *right_ptr, *down_ptr = head;
   while (down_ptr) {
      right_ptr = down_ptr;
      while (right_ptr) {
         cout << right_ptr->data << " ";
         right_ptr = right_ptr->right;
      }
      cout << endl;
      down_ptr = down_ptr->down;
   }
}
TreeNode* make_2d_list(int mat[][3], int i, int j, int m, int n) {
   if (i > n - 1 || j > m - 1)
      return NULL;
   TreeNode* temp = new TreeNode(mat[i][j]);
   temp->right = make_2d_list(mat, i, j + 1, m, n);
   temp->down = make_2d_list(mat, i + 1, j, m, n);
   return temp;
}
int main() {
   int m = 3, n = 3;
   int mat[][3] = {
      { 10, 20, 30 },
      { 40, 50, 60 },
      { 70, 80, 90 } };
   TreeNode* head = make_2d_list(mat, 0, 0, m, n);
   show_2d_list(head);
}

입력

{ { 10, 20, 30 },
{ 40, 50, 60 },
{ 70, 80, 90 } }

출력

10 20 30
40 50 60
70 80 90