当矩阵在 C 中实现为列表时重新排列矩阵行

Posted

技术标签:

【中文标题】当矩阵在 C 中实现为列表时重新排列矩阵行【英文标题】:Rearranging matrix rows when the matrix is implemented as a list in C 【发布时间】:2013-04-18 22:40:59 【问题描述】:

我的任务是使用 C 给定两个简单规则重新排列矩阵的行。 1. 如果最后一列的数字是正数,则该行应移到顶部。 2. 如果最后一列的数字为零,则该行应移到底部。

例如,如果我有 1,2,0,4,5,-6,7,8,9,1,1,1 我会得到 1,1 ,1,7,8,9,4,5,-6,1,2,0。

为此,我将矩阵实现为单链表,其中节点表示矩阵的行。然后我创建了一个名为“重新排列”的函数,它应该为我完成任务。我已经能够解决所有情况下的问题,除非第一行最后一列中的数字为 0。那么我得到的只是 0。例如 023 或 1, 2, 0,4, 5, 67,8,9 都给出 0。如果有人可以查看我的代码并可能给我一些输入,我会非常高兴。这是我的代码:

typedef struct node node;
typedef struct list list;

struct list
node* first;
node* last;
;

struct node                                                               
  int* data;        
  node* next;       
;      

list* newList(int* data);   
static node* newNode(int* data);       
list* newList(int* data);                                              
void insertFirst(list* head, int* data);
void insertLast(list* head, int* data);
void rearrange(list* head,int rows, int cols);
void printList(list* head,int cols);


int main()
int a[1] = 0;
int b[1] = -2;
int c[1] = -3;
//int d[1] = -4; // if we want more rows
//int e[1] = -5;
//Create empty list
list* head = newList(a);
//Add rows
insertLast(head,b);
insertLast(head,c);
//insertLast(head,d);
//insertLast(head,e);
rearrange(head,3,1);
//Print all elements
printList(head,1);
return 0;


void printList(list* head,int cols)
int i;
node* currentEl = head->first;
while(currentEl != NULL) 
    for(i=0;i<cols;i++)
        printf("%d, ",currentEl->data[i]);
    
    printf("\n");
    currentEl = currentEl->next;



void rearrange(list* head,int rows,int cols)
head->last->next = head->first;
node* currentEl = head->last;
node* nextEl = head->first;
node* temp;
int count = 1;

while(count != rows+1)
    int a = nextEl->data[cols-1];
    temp = nextEl->next;
    if(a>0 && count != 1)
        nextEl->next = head->first; 
        head->first = nextEl;
        currentEl->next = temp; 
    else if(a==0 && head->first->data[cols-1] != 0) 
        head->last->next = nextEl;
        head->last = nextEl;
        nextEl->next = NULL;
        currentEl->next = temp; 
     else if(a==0 && head->first->data[cols-1] == 0) // this needs to be changed
        head->last->next = nextEl;
        head->last = nextEl;
        nextEl->next = NULL;
        currentEl->next = temp;
     else 
        currentEl = nextEl;
    
    //nextEl = nextEl->next; 
    nextEl = currentEl->next;
    if(count == 1)
        head->last->next = NULL;
    
    count++;




void insertFirst(list* head, int* data)
node* temp;
temp = newNode(data);
temp->next = head->first;
head->first = temp;



void insertLast(list* head, int* data)
node* temp;
temp = newNode(data);
head->last->next = temp;
head->last = temp;


static node* newNode(int* data)
node* new;
new = (node*)malloc(sizeof(node));
new->next = NULL;
new->data = data;
return new;


list* newList(int* data)
list* head;
node* node = newNode(data);
head = (list*)malloc(sizeof(list));
head->first = node;
head->last = node;
return head;

【问题讨论】:

【参考方案1】:

不确定这是否是您需要的,但下面的代码会变成: 1,2,0,4,5,-6,7,8,9,1,1,1 转为 1,1,1,7,8,9,4,5,-6,1,2,0 但是,您需要将此 C# 代码转换为 C,并使用一维数组而不是二维数组。即,您将拥有1,2,0,4,5,-6,7,8,9,1,1,1,而不是1,2,0,4,5,-6,7,8,9,1,1,1。 在您的情况下,elementsPerGroup 是 3。

        private static byte[] ReverseArray(int elementsPerGroup, byte[] forwardsArray)
        
            int length = forwardsArray.Length;
            byte[] reversedArray = new byte[length];

            int groupIdentifier = 0;

            for (int i = 0; i < length; i++)
            
                if (i != 0 && i % elementsPerGroup == 0)
                
                    groupIdentifier += 2 * elementsPerGroup;
                
                int index = length - elementsPerGroup - groupIdentifier + i;
                reversedArray[i] = forwardsArray[index];
            
            return reversedArray;
        

【讨论】:

以上是关于当矩阵在 C 中实现为列表时重新排列矩阵行的主要内容,如果未能解决你的问题,请参考以下文章

如何将向量重新排列为列而不是行?

在R中重新排列多个矩阵的形状

matlab中已知一矩阵,如何将其中的已知的元素打乱顺序进行随机排列得到新的矩阵,如:

1170. 重塑矩阵

matlab中如何交换矩阵的行或者列

tyvj 1198 矩阵连乘——区间dp