#include <stdio.h>#include <stdlib.h>typedef struct { int row; int col; int val;} Element;typedef struct { int row; int col; int count; Element *elements;} SparseMatrix;SparseMatrix *createSparseMatrix(int row, int col, int count) { SparseMatrix *matrix = (SparseMatrix*)malloc(sizeof(SparseMatrix)); matrix->row = row; matrix->col = col; matrix->count = count; matrix->elements = (Element*)malloc(count * sizeof(Element)); return matrix;}void destroySparseMatrix(SparseMatrix *matrix) { free(matrix->elements); free(matrix);}void printSparseMatrix(SparseMatrix *matrix) { int i, j, k; k = 0; for (i = 0; i < matrix->row; i++) { for (j = 0; j < matrix->col; j++) { if (k < matrix->count && matrix->elements[k].row == i && matrix->elements[k].col == j) { printf("%d ", matrix->elements[k].val); k++; } else { printf("0 "); } } printf("\n"); }}SparseMatrix *compressSparseMatrix(int **a, int row, int col) { int i, j, k, count; for (i = 0, count = 0; i < row; i++) { for (j = 0; j < col; j++) { if (a[i][j] != 0) { count++; } } } SparseMatrix *matrix = createSparseMatrix(row, col, count); for (i = 0, k = 0; i < row; i++) { for (j = 0; j < col; j++) { if (a[i][j] != 0) { matrix->elements[k].row = i; matrix->elements[k].col = j; matrix->elements[k].val = a[i][j]; k++; } } } return matrix;}int main() { int a[3][4] = { {1, 0, 0, 0}, {0, 0, 2, 0}, {0, 3, 0, 4} }; SparseMatrix *matrix = compressSparseMatrix((int**)a, 3, 4); printSparseMatrix(matrix); destroySparseMatrix(matrix); return 0;}
时间: 2023-06-14 08:07:09 浏览: 254
这段代码实现了稀疏矩阵和普通矩阵的相互转换,其中稀疏矩阵使用了压缩存储方式。具体来说,这段代码实现了以下几个函数:
1. `createSparseMatrix`:创建稀疏矩阵,输入参数为矩阵的行数、列数和非零元素个数,返回值为稀疏矩阵的指针。
2. `destroySparseMatrix`:销毁稀疏矩阵,输入参数为稀疏矩阵的指针。
3. `printSparseMatrix`:打印稀疏矩阵,输入参数为稀疏矩阵的指针。
4. `compressSparseMatrix`:将普通矩阵转换为稀疏矩阵,输入参数为普通矩阵的指针、行数和列数,返回值为稀疏矩阵的指针。
在 `main` 函数中,首先定义了一个普通矩阵 `a`,然后调用 `compressSparseMatrix` 将其转换为稀疏矩阵,最后调用 `printSparseMatrix` 打印稀疏矩阵,并使用 `destroySparseMatrix` 销毁稀疏矩阵。
相关问题
纠正一下代码中存在的问题#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct thing{ int val;//价值 int vol;//重量 }thing[1011]; int T, N, V; int dp[1011][1011]; int ans() { memset(dp,0,sizeof(dp)); for(int i = 0;i <= N;i++) { for(int j = 0;j <= V;j++) { if(thing[i].vol>j) { dp[i][j] = dp[i-1][j]; } else { dp[i][j] = max(dp[i-1][j],dp[i-1][j-thing[i].vol+thing[i].val); } } return dp[N][V]; } int main() { scanf("%d",&T); while(T--) { scanf("%d %d",&N,&V); for(int i = 1;i <= N;i++) { scanf("%d",thing[i].val); } for(int j = 0;j <= N;j++) { scanf("%d",thing[j].vol); } printf("%d\n",ans()); } return 0; } }
这段代码存在几个问题:
1. 在结构体定义中,将结构体类型定义为 thing[1011],这是错误的写法,应该是 typedef struct thing{ int val; int vol; }thing;
2. 在ans函数中,return语句应该在for循环之外,否则只会执行一次循环即返回结果。
3. 在输入数据时,scanf函数中要加取地址符&,即应该是scanf("%d",&thing[i].val);和scanf("%d",&thing[j].vol);
下面是修改后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct thing{
int val;//价值
int vol;//重量
}thing;
int T, N, V;
thing things[1011];
int dp[1011][1011];
int ans() {
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= V; j++) {
if(things[i].vol > j) {
dp[i][j] = dp[i-1][j];
} else {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-things[i].vol] + things[i].val);
}
}
}
return dp[N][V];
}
int main() {
scanf("%d", &T);
while(T--) {
scanf("%d %d", &N, &V);
for(int i = 1; i <= N; i++) {
scanf("%d", &things[i].val);
}
for(int j = 1; j <= N; j++) {
scanf("%d", &things[j].vol);
}
printf("%d\n", ans());
}
return 0;
}
```
#include<stdio.h> #include<stdlib.h> define char TElemType typedef struct BiTNode{ TElemType data; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree; void CreateBiTree(BiTree *T) { char ch; scanf("%c", &ch); if (ch == '#') { *T = NULL; } else { *T = (BiTree)malloc(sizeof(BiTNode)); (*T)->data = ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } void printTree(TreeNode* root) { if (root == NULL) { printf("# "); return; } printf("%c ", root->val); printTree(root->left); printTree(root->right); } int main() { BiTree T = NULL; printf("请输入先序遍历序列:\n"); CreateBiTree(&T); return 0; }这个C语言代码怎么改
这段代码存在一些问题:
1. `define char TElemType` 应该改为 `typedef char TElemType`,使得`TElemType` 成为一个类型别名,代表了二叉树节点的数据类型。
2. 函数 `printTree(TreeNode* root)` 没有声明,应该修改为 `void printTree(BiTree root)`。
修改后的代码如下:
```
#include<stdio.h>
#include<stdlib.h>
typedef char TElemType; // 定义二叉树节点的数据类型
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode, *BiTree;
void CreateBiTree(BiTree *T) {
char ch;
scanf("%c", &ch);
if (ch == '#')
{
*T = NULL;
}
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
void printTree(BiTree root) {
if (root == NULL) {
printf("# ");
return;
}
printf("%c ", root->data);
printTree(root->lchild);
printTree(root->rchild);
}
int main() {
BiTree T = NULL;
printf("请输入先序遍历序列:\n");
CreateBiTree(&T);
printTree(T);
return 0;
}
```
这样就可以正确地根据输入的先序遍历序列建立一棵以二叉链表表示的二叉树,并输出这棵树的先序遍历序列了。