C语言编程题,用指针,不用函数讲一个3*3矩阵转置
发布网友
发布时间:2022-05-09 19:16
我来回答
共2个回答
热心网友
时间:2023-10-14 15:38
/****************************
file:func_dec.h
des: fuctions declaration
*****************************/
//fun_name:get_argc()
//usage:得到矩阵维数
//argcs:
//argcs usage:返回矩阵维数
int get_argc();
//fun_name:display()
//usage:打印矩阵
//argcs:链表头指针,矩阵维数
//argcs usage:
void display(struct Node *,int );
//fun_name:free_mem()
//usage:释放内存
//argcs:要释放链表链表头指针
//argcs usage:返回1代表释放成功,否则失败
int free_mem(struct Node *);
///fun_name:fill_blank()
//usage:对副链表进行数字填充
//argcs:副链表头指针,索引节点,填充数字
//argcs usage:
void fill_blank(struct Node *,int ,int fill_num);
//fun_name:creat_link()
//usage:创建一个链表,并返回链表头指针
//argcs:链表初始头指针,要创建矩阵维数
//argcs usage:
struct Node *creat_link(struct Node *,int );
//fun_name:Rotating()
//usage:对链表进行角度旋转处理 90,180,270度
//argcs:链表头指针,矩阵维数,旋转选项
//argcs usage: 1 是90度旋转
// 2 是180度旋转
// 3 是270度旋转
struct Node * Rotating(struct Node *,int ,int );
/************
*********/
struct Node{
int num;
struct Node *next;
};
/******************************
程序名:link
程序功能:实现用链表完成矩阵的旋转转换
作者:Hamlet
版本:1.2
程序说明:相对与1.1版本进行了函数的缩减,将无用的函数删除,但未缩减时间和空间复杂度
func_dec.h是对程序函数声明
struct_dec.h是对结构体声明
遗憾的是本程序没有使用迭代,如果用的话,程序将很漂亮。
开始写作时间:2007-09-14
最后修改时间:2007-09-15
*******************************/
#include "stdio.h"
#include "stdlib.h"
#include "struct_dec.h"
#include "func_dec.h"
//得到矩阵参数
int get_argc(){
int argc = 0;
while(!argc){
printf("input argc:\n");
scanf("%d",&argc);
}
return argc;
}
//打印矩阵
void display(struct Node *head,int argc){
int switch_line = 0;
if(head == NULL)
return ;
while(head != NULL){
printf("%5d",head->num);
switch_line++;
if(!(switch_line%argc))
printf("\n");
head = head->next;
}
}
//内存释放,1代表释放成功
int free_mem(struct Node *head){
struct Node *st_temp;
if(head == NULL)
return 0;
while(head != NULL){
st_temp = head->next;
free(head);
head = st_temp;
}
return 1;
}
void fill_blank(struct Node *head,int search_node,int fill_num){
int current_node = 0;
while(current_node < search_node){
head = head->next;
current_node++;
}
head->num = fill_num;
return ;
}
//创建链表 arcg*argc
//返回链表头指针
struct Node *creat_link(struct Node *head,int argc){
int current_node = 0;//当前所在接点处
int ele_amount = argc*argc;//元素个数
for(;current_node < ele_amount;current_node ++){
struct Node *st_temp = (struct Node*)malloc(sizeof(struct Node));
if(st_temp == NULL){
printf("memory loss!\n");
exit(0);
}
st_temp->num = current_node;
st_temp->next = head;
head = st_temp;
}
return head;
}
/*
函数名称:Rotating()
函数功能:将矩阵旋转
传入参数:struct Node *head,int argc
传出参数:无
参数说明:choice:1代表是旋转90度,2代表旋转180度,3代表旋转270度
180度是旋转两个90度,270度是旋转3个90度。
*/
struct Node * Rotating(struct Node *head,int argc,int choice){
struct Node *vice_head = NULL;
int loop_time = 0;//旋转多少个90度
int r_counter = 0,c_counter = 0;//当前接点对应在数组中的位置 行与列
int current_node = 0;//当前接点标记
int search_node = 0;//索引接点
vice_head = creat_link(vice_head,argc);//创建副链表
struct Node * head_temp = head;
while(current_node < argc*argc){
r_counter = (int)current_node/argc;
c_counter = current_node%argc;
search_node = (argc-c_counter-1)*argc + r_counter;//索引搜索算法函数
fill_blank(vice_head,search_node,head_temp->num);
current_node++;
head_temp = head_temp->next;
}
//数据回拷
head_temp = head;
while(head_temp != NULL){
head_temp->num = vice_head->num;
head_temp = head_temp->next;
vice_head = vice_head->next;
}
free_mem(vice_head);
return head;
}
int main(){
int argc = 0;// 矩阵维数
int choice = 0;//选项 1-90度 2-180度 3-270度
int loop_time = 0;//旋转次数计数器
struct Node *head = NULL;
argc = get_argc();
head = creat_link(head,argc);
//原矩阵打印
display(head,argc);
printf("1:90 2:180 3:270\n");
printf("input your choice:");
while(!choice)
scanf("%d",&choice);
while(loop_time++ < choice)
head = Rotating(head,argc,choice);
display(head,argc);
if(free_mem(head))
printf("success!\n");
else printf("error!\n");
return 0;
}
转置90,180,270都可以,希望对你有帮助
热心网友
时间:2023-10-14 15:38
#include <stdio.h>
main()
{
int a[3][3],i,j,t;
int (*p)[3]=a;
printf("input a array:\n");
for(i=0;i<3;i++)
{
printf("the %d row:",i+1);
for(j=0;j<3;j++)
scanf("%d",&p[i][j]);
}
printf("first:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%4d",p[i][j]);
printf("\n");
}
for(i=0;i<3;i++)
for(j=0;j<i;j++)
{
t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
printf("after:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%4d",p[i][j]);
printf("\n");
}
}
//调试成功