daAzai / C

0 stars 0 forks source link

链表实现矩阵乘法 #8

Open daAzai opened 5 years ago

daAzai commented 5 years ago

include

include

define LEN sizeof(struct s)

define N 3

int i, j;

struct s { int num; struct s *next; };

struct s first() { struct s head = NULL; struct s line1 = NULL, line2 = NULL; struct s column1 = NULL, column2 = NULL; for (i = 0; i < N; i ++){ column1 = (struct s )malloc(LEN); for (j = 0; j < N; j ++){ line1 = (struct s )malloc(LEN); line1->num = j; //scanf("%d", &line1->num); line1->next = NULL; if (j == 0) column1 = line1; else line2->next = line1; line2 = line1; } column1->next = NULL; if (i == 0) head = column1; else column2->next = column1; column2 = column1; } return head; }

struct s *second() { int data[N][N];

struct s *head = NULL;
struct s *line1 = NULL, *line2 = NULL;
struct s *column1 = NULL, *column2 = NULL;

for (i = 0; i < N; i ++){
    for (j = 0; j < N; j ++){
        data[i][j] = j;
        //scanf("%d", &data[i][j]);
    }
}
for (i = 0; i < N; i ++){
    line1 = (struct s *)malloc(LEN);
    for (j = 0; j < N; j ++){
        column1 = (struct s *)malloc(LEN);
        column1->num = data[j][i];
        column1->next = NULL;
        if (j == 0)
            line1 = column1;
        else
            column2->next = column1;
        column2 = column1;
    }
    line1->next = NULL;
    if (i == 0)
        head = line1;
    else
        line2->next = line1;
    line2 = line1;
}
return head;

}

struct s calculate(struct s data1, struct s data2) { struct s head = NULL; struct s line1 = NULL, line2 = NULL; struct s column1 = NULL, column2 = NULL; struct s data1_p1 = NULL, data1_p2 = NULL; struct s data2_p1 = NULL, data2_p2 = NULL; int sum = 0;

for (i = 0; i < N; i ++){
    column1 = (struct s *)malloc(LEN);
    for (j = 0; j < N; j ++){
        line1 = (struct s *)malloc(LEN);
        data1_p1 = data1;
        data2_p1 = data2;
        for (int m = 0; m < i; m ++){
            data1_p1 = data1_p1->next;
            data2_p1 = data2_p2->next;
        }
        data1_p2 = data1_p1;
        data2_p2 = data2_p1;
        sum = 0;
        for (int q = 0; q < N; q ++){
            sum = sum + data1_p2->num * data2_p2->num;
            data1_p2 = data1_p2->next;
            data2_p2 = data2_p2->next;
        }
        line1->num = sum;
        line1->next = NULL;
        if (j == 0)
            column1 = line1;
        else
            line2->next = line1;
        line2 = line1;
    }
    column1->next = NULL;
    if (i == 0)
        head = column1;
    else
        column2->next = column1;
    column2 = column1;
}
return head;

}

void print(struct s head) { struct s line = NULL; struct s *column = head; for (i = 0; i < N; i ++){ line = column; for (j = 0; j < N; j ++){ printf("%d\t", line->num); line = line->next; } column = column->next; printf("\n"); } }

int main () { print(calculate(first(), second())); return 0; }