【问题标题】:Unable to create a linked list matrix无法创建链表矩阵
【发布时间】:2020-08-08 22:14:30
【问题描述】:

我正在尝试将数组转换为链表矩阵。如果我的输入是:

1 2 3
4 5 6
7 8 9

那么链表矩阵就是这样的:

1 -> 2 -> 3 -> NULL
|    |    |
v    v    v
4 -> 5 -> 6 -> NULL
|    |    |
v    v    v
7 -> 8 -> 9 -> NULL
|    |    |
v    v    v
NULL NULL NULL

我已尝试调试代码。我在col = col->down 中遇到分段错误错误。但我无法理解这个错误背后的原因。这是供您参考的代码。

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
  int data;
  struct node *next;
  struct node *down;
}matrix;
matrix *start = NULL;
void insert();
void arrToMatrix();
void arrDisplay();
void matrixDisplay();
int a[10][10];
int r,c;
int main()
{
  int n;
  printf("1:Insert elements 2:Convert Array to Linked Matrix 3:Display Array 4:Display Linked Matrix\n");
 for(;;)
 {
   printf("Enter choice: ");
   scanf("%d",&n);
   switch(n)
   {
      case 1: insert();
      break;
      case 2: arrToMatrix();
      break;
      case 3: arrDisplay();
      break;
      case 4: matrixDisplay();
      break;
      default: printf("Wrong Input\n");
      exit(0);
   }
 }
 return 0;
}

void insert()
{
  int i,j;
  printf("Enter row: ");
  scanf("%d",&r);
  printf("\nEnter column: ");
  scanf("%d",&c);
  printf("Enter elements: \n");
  for(i=0;i<r;i++)
      for(j=0;j<c;j++)
        scanf("%d",&a[i][j]);
}
void arrDisplay()
{
  int i,j;
  printf("Array elements: \n");
  for(i=0;i<r;i++)
  {
    for(j=0;j<c;j++)
    {
      printf("%d ",a[i][j]);
    }
    printf("\n");
  }
}
void arrToMatrix()
{
  int i,j;
  matrix *ptr, *col, *row;
  ptr = malloc(sizeof(matrix));
  ptr->data = a[0][0];
  ptr->next = NULL;
  ptr->down = NULL;
  start = ptr;
  col = start;
  for(i=0;i<r;i++)
  {
    row = col;
    for(j=0;j<c;j++)
    {
      ptr = malloc(sizeof(matrix));
      ptr->data = a[i][j];
      ptr->next = NULL;
      ptr->down = NULL;
      if(row == col)
        row = ptr;
      else
      {
        while(row->next!=NULL)
          row = row->next;
        row->next = ptr;
      }
    }
    col = col->down;
  }
}

void matrixDisplay()
{
  matrix *row, *col, *ptr;
  col = start;
  while(col!=NULL)
  {
    row = col;
    while(row!=NULL)
    {
      printf("%d ",row->data);
      row = row->next;
    }
    printf("\n");
    col = col->down;
  }
}

【问题讨论】:

    标签: c arrays matrix linked-list


    【解决方案1】:

    很好的练习。我有一个使用静态指针矩阵方法的解决方案。您可以以相同的方式动态分配它,但只是为了了解一下。

    那么,我们开始吧:

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct node
    {
      int data;
      struct node *next;
      struct node *down;
    } matrix;
    
    matrix *start = NULL;
    
    #define MAX_DIM 10
    
    matrix ptrMatrix[MAX_DIM][MAX_DIM];
    
    void insert();
    void arrToMatrix();
    void arrDisplay();
    void matrixDisplay();
    
    int a[MAX_DIM][MAX_DIM];
    int r,c;
    
    int main()
    {
      int n;
     for(;;)
     {
       printf("1:Insert elements 2:Convert Array to Linked Matrix 3:Display Array 4:Display Linked Matrix\n");
       printf("Enter choice: ");
       scanf("%d",&n);
       switch(n)
       {
          case 1: insert();
          break;
          case 2: arrToMatrix();
          break;
          case 3: arrDisplay();
          break;
          case 4: matrixDisplay();
          break;
          default: printf("Wrong Input\n");
          exit(0);
       }
     }
     return 0;
    }
    
    void insert()
    {
      int i,j;
      printf("Enter number of rows: ");
      scanf("%d",&r);
      printf("\nEnter number of columns: ");
      scanf("%d",&c);
    
      if(r >= MAX_DIM)
      {
          printf("\nNo more than %d rows please!\n");
          return;
      }
    
      if(c >= MAX_DIM)
      {
          printf("\nNo more than %d columns please!\n");
          return;
      }
    
      printf("\n Now enter the elements (%d number in total): \n", r*c);
      for(i=0;i<r;i++)
      {
          for(j=0;j<c;j++)
          {
            scanf("%d",&a[i][j]);
          }
      }
    }
    void arrDisplay()
    {
      int i,j;
      printf("Array elements: \n");
      for(i=0;i<r;i++)
      {
        for(j=0;j<c;j++)
        {
          printf("%d ",a[i][j]);
        }
        printf("\n");
      }
    }
    void arrToMatrix()
    {
      if(r<=0 || c <=0)
      {
          printf("Matrix is empty. Try again!\n");
          return;
      }
    
      int i,j;
    
      for(i=0;i<r-1;i++)
      {
          for(j=0;j<c-1;j++)
          {
            ptrMatrix[i][j].data = a[i][j];
            ptrMatrix[i][j].next = &ptrMatrix[i][j+1];
            ptrMatrix[i][j].down = &ptrMatrix[i+1][j];
          }
    
          ptrMatrix[i][c-1].data = a[i][c-1];
          ptrMatrix[i][c-1].next = NULL;
          ptrMatrix[i][c-1].down = &ptrMatrix[i+1][c-1];
      }
    
      for(j=0;j<c-1;j++)
      {
        ptrMatrix[r-1][j].data = a[r-1][j];
        ptrMatrix[r-1][j].next = &ptrMatrix[r-1][j+1];
        ptrMatrix[r-1][j].down = NULL;
      }
    
      ptrMatrix[r-1][c-1].data = a[r-1][c-1];
      ptrMatrix[r-1][c-1].next = NULL;
      ptrMatrix[r-1][c-1].down = NULL;
    
      start = &(ptrMatrix[0][0]);
    }
    
    void matrixDisplay()
    {
      matrix *row, *col;
      col = start;
      while(col!=NULL)
      {
        row = col;
        while(row!=NULL)
        {
          printf("%d ",row->data);
          row = row->next;
        }
        printf("\n");
        col = col->down;
      }
    }
    

    【讨论】:

    • 谢谢@Dr.-Ing。格哈德·斯坦因。
    【解决方案2】:

    ptr->down 在您的情况下始终为 NULL。它永远不会被初始化。所以 col=col->down 将值 NULL 分配给 col

    【讨论】:

      【解决方案3】:

      作业对初学者来说并不容易。

      对于初学者来说,使用像start 这样的全局变量并且函数定义依赖于全局变量是个坏主意。

      例如,您不能在程序中定义多个矩阵。

      在函数arrToMatrix 中,您必须处理指向指针的指针。否则函数会更复杂或者指针 start 不会改变,因为在你的程序中改变局部变量 col 和 row 不会影响 i=on 指针 start。此外,例如在此代码中 sn-p

        ptr = malloc(sizeof(matrix));
        ptr->data = a[i][j];
        ptr->next = NULL;
        ptr->down = NULL;
        if(row == col)
          row = ptr;
      

      当i等于0,j等于0时,存在一个节点的冗余分配。

      在函数的开始,由头指针指向的当前矩阵应该被释放。否则可能会出现内存泄漏,用户将无法使用不同的数组重新分配矩阵。

      所以你需要再写一个函数来释放当前矩阵的所有分配内存。

      这是一个演示程序,展示了如何实现这些功能。在程序中有注释函数matrixDisplay 用于测试。您可以运行它而不是未注释的函数 matrixDisplay 来查看列表及其链接是如何定义的。

      #include <stdio.h>
      #include <stdlib.h>
      
      typedef struct node
      {
          int data;
          struct node *next;
          struct node *down;
      } matrix;
      
      void deleteMatrix( matrix **head )
      {
          if ( *head != NULL )
          {
              for ( matrix *row = ( *head )->next; row != NULL; )
              {
                  while ( row != NULL )
                  {
                      matrix *tmp = row;
                      row = row->next;
                      free( tmp );
                  }
      
                  row = ( *head )->down;
      
                  if ( ( *head )->down != NULL )
                  {
                      ( *head )->down = row->down;
                  }
              }
      
              free( *head );
              *head = NULL;
          }
      }
      
      void arrToMatrix( matrix **head, size_t m, size_t n, int a[m][n] )
      {
          deleteMatrix( head );
      
          matrix **row = head;
      
          for ( size_t i = 0; i < m; i++ )
          {
              matrix **column = row;
      
              for ( size_t j = 0; j < n; j++ )
              {
                  *column = malloc( sizeof( matrix ) );
                  ( *column )->data = a[i][j];
                  ( *column )->down = NULL;
                  ( *column )->next = NULL;
      
                  column = &( *column )->next;    
              }
      
              row = &( *row )->down;
          }
      
          row = head;
      
          for ( size_t i = 0; i + 1 < m; i++ )
          {
              matrix *column   = *row;
              matrix *next_row_column = ( *row )->down;
      
              for ( size_t j = 0; j < n; j++ )
              {
                  column->down = next_row_column;
                  column = column->next;
                  next_row_column = next_row_column->next;
              }           
      
              row = &( *row )->down;
          }
      }
      
      void matrixDisplay( const matrix *head )
      {
          for ( ; head != NULL; head = head->down )
          {
              for ( const matrix *column = head; column != NULL; column = column->next )
              {
                  printf( "%2d ", column->data );
              }
              putchar( '\n' );
          }
      }
      /*
      void matrixDisplay( const matrix *head )
      {
          for ( ; head != NULL; head = head->down )
          {
              for ( const matrix *column = head; column != NULL; column = column->next )
              {
                  printf( "%2d ( %p ): next( %p ), down( %p )  ", 
                           column->data, ( void * )column, ( void * )column->next, ( void * )column->down );
              }
              putchar( '\n' );
          }
      }
      */
      int main(void) 
      {
          enum { N = 3 };
          int a[][N] = 
          {
              { 1, 2, 3 },
              { 4, 5, 6 },
              { 7, 8, 9 }
          };
      
          matrix *head = NULL;
      
          arrToMatrix( &head, N, N, a );
      
          matrixDisplay( head );
          putchar( '\n' );
      
          deleteMatrix( &head );
      
          return 0;
      }
      

      程序输出是

       1  2  3 
       4  5  6 
       7  8  9 
      

      带注释的函数 matrixDisplay 的输出可能如下所示。

       1 ( 0x558b577e7260 ): next( 0x558b577e7280 ), down( 0x558b577e72c0 )   2 ( 0x558b577e7280 ): next( 0x558b577e72a0 ), down( 0x558b577e72e0 )   3 ( 0x558b577e72a0 ): next( (nil) ), down( 0x558b577e7300 )  
       4 ( 0x558b577e72c0 ): next( 0x558b577e72e0 ), down( 0x558b577e7320 )   5 ( 0x558b577e72e0 ): next( 0x558b577e7300 ), down( 0x558b577e7340 )   6 ( 0x558b577e7300 ): next( (nil) ), down( 0x558b577e7360 )  
       7 ( 0x558b577e7320 ): next( 0x558b577e7340 ), down( (nil) )   8 ( 0x558b577e7340 ): next( 0x558b577e7360 ), down( (nil) )   9 ( 0x558b577e7360 ): next( (nil) ), down( (nil) )  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-24
        • 2019-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多