c语言三元组
A. c语言怎么在main函数中直接写出一个三元组
你是说输出一串数据,按3个一组?若是,程序如下。
程序用随机数,如果你自己已有数据,可以放在数组里,依次输出便可。
#include<stdio.h>
#include <time.h>
int main() {
int x;
int i,n;
srand(time(0)); //随机种子
n=5; //假定5组
printf("T={");
for (i=0;i<n;i++){
printf("(");
x=rand()%100;printf("%d,",x);
x=rand()%100;printf("%d,",x);
x=rand()%100;printf("%d),",x);
}
printf("\b}\n");
return 0;
}
例如输出:T={(54,65,4),(92,58,76),(30,36,70),(74,4,91),(48,31,32)}
B. C语言 三元组 问题
//三元组表示稀疏矩阵
#include<stdio.h>
#define N 1000
typedef struct Elem
{
int i,j;
int e;
} ELEM; /* 表示一个元素的三元组结构 */
void main()
{
ELEM mat[N];
int row,col; /* 行列数 */
int i,j,k=0,n;
int x;
char fn[]="data.txt";
FILE *pf=fopen(fn,"r");
if(!pf){
printf("Error: Can't open the file: %s\n",fn);
return;
}
fscanf(pf,"%d%d",&row,&col); /* 读取行列数 */
/* 读取矩阵数据,并存入三元组 */
for(i=0; i<row; i++)
for(j=0; j<col; j++){
fscanf(pf,"%d",&x);
if(x!=0){
mat[k].e=x;
mat[k].i=i;
mat[k].j=j;
if(k%5==0) printf("\n");
k++;
printf("[%2d][%2d]=%3d ",i,j,x);
}
}
printf("\n");
fclose(pf);
n=k; k=0;
/* 将给定的一个三元组(就用前面得到的这个三元组),输出稀疏矩阵 */
for(i=0; i<row; i++){
for(j=0; j<col; j++){
if(mat[k].i==i && mat[k].j==j){
printf("%3d ",mat[k].e);
k++;
}else
printf("%3d ",0);
}
printf("\n");
}
printf("\n");
}
/*
注意,为了便于测试,将一个稀疏矩阵保存于数据文件data.txt中(该文件放在源程序所在的目录中),文件的内容如下:
第一行两个数据(数据间用空格分隔):r c(分别表示矩阵行数和列数)
接下来是矩阵的数据,共有r行,每行c个数据。例如:
10 10
0 0 0 0 0 1 0 0 0 1
2 0 0 0 1 0 0 0 0 0
0 3 0 0 0 0 0 1 0 0
0 0 0 0 0 0 4 0 0 0
0 0 5 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0 0 1
2 0 0 0 1 0 0 0 0 0
0 3 0 0 0 0 0 1 0 0
0 0 0 0 0 0 4 0 0 0
0 0 5 0 0 0 0 0 1 0
*/
C. C语言三元组输入输出的转置矩阵
用三元组存储的稀疏矩阵的转置运算
三元组采用行优先表示法,转置后的矩阵的三元组同样要采用行优先表示法
0 1 12
0 2 9
2 0 -3
3 5 14
3 2 24
4 1 18
5 0 15
5 3 -7
struct node
{
int i,j; //定义三元组的行、列号
int v; //三元组的值
};
struct sparmatrix
{
int rows,cols; //稀疏矩阵的行、列数
int terms; //稀疏矩阵的非零元个数
struct node data[maxsize]; //存放稀疏矩阵的三元组表
};
(1)按照A的列序进行转置
由于A的列即为B的行,在a.data(原表)中,按列扫描,则得到的b.data(转置表)必按行优先存放。
但为了找到A的每一列中所有的非零的元素,每次都必须从头到尾扫描A的三元组表(有多少列,则扫描多少遍)
void transpose(struct sparmatrix a)
{
struct sparmatrix b; /*b为a的转置*/
int ano,bno=0,col,i;
b.rows=a.cols; b.cols=a.rows;
b.terms=a.terms;
if (b.terms>0)
{
for ( col=0; col<a.cols; col++) /*按列号扫描*/
for( ano=0;ano<a.terms;ano++) /*对三元组扫描*/
if (a.data[ano].j==col) /*进行转置*/
{ b.data[bno].j=a.data[ano].i;
b.data[bno].i=a.data[ano].j;
b.data[bno].v=a.data[ano].v;
bno++;
}
}
…………….
(2)按照A的行序进行转置
即按a.data中三元组的次序进行转置,并将转置后的三元组放入b中恰当的位置。
若能在转置前求出矩阵A的每一列col(即B中每一行)的第一个非零元转置后在b.data中的正确位置pot[col](0≤col<a.cols),那么在对a.data的三元组依次作转置时,只要将三元组按列号col放置到b.data[pot[col]]中,之后将pot[col]内容加1,以指示第col列的下一个非零元的正确位置。
void fastrans(struct sparmatrix a)
{
struct sparmatrix b;
int pot[maxsize],col,ano,bno,t,i;
b.rows=a.cols; b.cols=a.rows;
b.terms=a.terms;
if(b.terms>0)
{
for(col=0;col<=a.cols;col++)
pot[col]=0;
for( t=0;t<a.terms;t++) /*求出每一列的非零元个数*/
{
col=a.data[t].j;
pot[col+1]=pot[col+1]+1;
}
pot[0]=0;
for(col=1;col<a.cols;col++) /*求出每一列的第一个非零元在转置后的位置*/
pot[col]=pot[col-1]+pot[col];
for( ano=0;ano<a.terms;ano++) /*转置*/
{ col=a.data[ano].j;
bno=pot[col];
b.data[bno].j=a.data[ano].i;
b.data[bno].i=a.data[ano].j;
b.data[bno].v=a.data[ano].v;
pot[col]=pot[col]+1;
}
}
D. c语言三元组问题。
一、你这个代码写的是C++语言的方式,需要将文件名写成rrr.cpp才可以!
二、有一处错误,需要调整一下,以下为修改后的代码
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#defineArSize3
typedefintElemSet;
typedefintStatus;
voidInitTriplet(ElemSet*&T,ElemSetv1,ElemSetv2,ElemSetv3);//
StatusDestroyTriplet(ElemSet*T);
ElemSetGet(ElemSet*T,inti,ElemSet*e);
StatusPut(ElemSet*T,inti,ElemSete);
ElemSetMax(ElemSet*T);
ElemSetMin(ElemSet*T);
intmain()
{
ElemSet*T;
InitTriplet(T,100,200,300);//
ElemSete;
printf("第二个元素的值=%d ",Get(T,2,&e));
Put(T,3,150);
ElemSeta=Get(T,3,&a);
printf("第三个元素的值=%d ",a);
printf("最大的元素值=%d ",Max(T));
printf("最小的元素值=%d ",Min(T));
DestroyTriplet(T);
system("pause");
return0;
}
voidInitTriplet(ElemSet*&T,ElemSetv1,ElemSetv2,ElemSetv3)//因为你传递的是一维指针,如果只是普通参数传递,则,T的变化不能反应到主程序中去,所以,要定义成引用变量!
{
T=(ElemSet*)malloc(ArSize*sizeof(ElemSet));
if(!T)
{
printf("内存分配失败! ");
exit(EXIT_FAILURE);
}
T[0]=v1;
T[1]=v2;
T[2]=v3;
}
StatusDestroyTriplet(ElemSet*T)
{
free(T);
T=NULL;
return1;
}
ElemSetGet(ElemSet*T,inti,ElemSet*e)
{
if(i<1&&i>3)
return0;
*e=T[i-1];
return*e;
}
StatusPut(ElemSet*T,inti,ElemSete)
{
if(i<1&&i>3)
return0;
T[i-1]=e;
return1;
}
ElemSetMax(ElemSet*T)
{
ElemSetmax=T[0];
for(inti=1;i<ArSize;i++)
if(T[i]>max)
max=T[i];
returnmax;
}
ElemSetMin(ElemSet*T)
{
ElemSetmin=T[0];
for(inti=1;i<ArSize;i++)
if(T[i]<min)
min=T[i];
returnmin;
}
E. C语言数据结构问题,用结构体表示三元组(可以是不同类型的),并编程实现三元组基本操作给了我源代码
兄弟,你在fun函数中的t是局部变量,也就是说你并没有为全局变量分配内存。要这样改:
status fun(int **t,int v1,int v2,int v3)
{
*t=(int *)malloc(3*sizeof(int));
if(!(*t))exit(OVERFLOW);
(*t)[0]=v1;(*t)[1]=v2;(*t)[2]=v3;
return OK;
}
调用时:
fun(&t,v1,v2,v3);
F. 用C语言实现整形三元组A(12,5,34)和浮点型三元组B(12.5,1.2,124.6)的构造,
// Triplet.h 头文件
#ifndef _TRIPLET_H_
#define _TRIPLET_H_
#include<malloc.h>
#include<stdio.h>
#include<process.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef int ElemType; // 更改三元组数据类型 int, float, double
typedef ElemType *Triplet;
Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3); // 初始化三元组
Status DestroyTriplet(Triplet &T); // 销毁三元组
Status Get(Triplet T, int i, ElemType &e); // 得到三元组的值
Status Put(Triplet T, int i, ElemType e); // 给三元组赋值
Status Ascending(Triplet T); // 升序排列
Status Descending(Triplet T); // 降序排列
Status Max(Triplet T, ElemType &e); // 取得三元组最大值
Status Min(Triplet T, ElemType &e); // 取得三元组最小值
#endif
——————————————————————————————————
// Triplet.cpp 三元组各函数定义源文件
#include "Triplet.h"
Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3)
{ // 操作结果:构造三元组T,依次置T的三个元素的初值为v1,v2和v3
if (!(T = (ElemType *)malloc(3 * sizeof(ElemType))))
exit(OVERFLOW);
T[0] = v1, T[1] = v2, T[2] = v3;
return OK;
}
Status DestroyTriplet(Triplet &T)
{ // 操作结果:三元组T被销毁
free(T);
T = NULL;
return OK;
}
Status Get(Triplet T, int i, ElemType &e)
{ // 初始条件:三元组T已存在,1≤i≤3。操作结果:用e返回T的第i元的值
if (i<1 || i>3)
return ERROR;
e = T[i - 1];
return OK;
}
Status Put(Triplet T, int i, ElemType e)
{ // 初始条件:三元组T已存在,1≤i≤3。操作结果:改变T的第i元的值为e
if (i<1 || i>3)
return ERROR;
T[i - 1] = e;
return OK;
}
Status Ascending(Triplet T)
{ // 初始条件:三元组T已存在。操作结果:将T的三个元素按升序排列
for (int i = 0; i < 3; i++){
for (int j = 0; j < 2 - i; j++){
if (T[j]>T[j + 1]){
ElemType temp = T[j];
T[j] = T[j + 1];
T[j + 1] = temp;
}
}
}
return OK;
}
Status Descending(Triplet T)
{ // 初始条件:三元组T已存在。操作结果:将T的三个元素按降序排列
for (int i = 0; i < 3; i++){
for (int j = 0; j < 2 - i; j++){
if (T[j]<T[j + 1]){
ElemType temp = T[j];
T[j] = T[j + 1];
T[j + 1] = temp;
}
}
}
return OK;
}
Status Max(Triplet T, ElemType &e)
{ // 初始条件:三元组T已存在。操作结果:用e返回T的三个元素中的最大值
e = T[0] >= T[1] ? T[0] >= T[2] ? T[0] : T[2] : T[1] >= T[2] ? T[1] : T[2];
return OK;
}
Status Min(Triplet T, ElemType &e)
{ // 初始条件:三元组T已存在。操作结果:用e返回T的三个元素中的最小值
e = T[0] <= T[1] ? T[0] <= T[2] ? T[0] : T[2] : T[1] <= T[2] ? T[1] : T[2];
return OK;
}
——————————————————————————————————
// main1.cpp 如果Triplet.h里是typedef int ElemType; 即声明的整型三元组 主函数源文件
#include "Triplet.h"
int main(){
Triplet T;
ElemType m;
Status i;
i = InitTriplet(T, 12, 5, 34);
printf("整型三元组A:");
for (int k = 1; k <= 3; k++){
Get(T, k, m);
printf("%d ", m);
}
printf(" ");
if ((i = Max(T, m)) == OK)
printf("整型三元组中的最大值为:%d ", m);
Descending(T);
printf("降序排序后的三元组: 整型三元组A:");
for (int k = 1; k <= 3; k++){
Get(T, k, m);
printf("%d ", m);
}
printf(" ");
DestroyTriplet(T);
return 0;
}
G. c语言 三元组 还原
是这个意思吧?
#include <stdio.h>
struct TDATA
{
int x, y;
int n;
};
int main()
{
struct TDATA t[]={{5,2,9}, {3,6,8}, {1,4,6},{2,3,7}};
int *m;
int xmax=-1, ymax=-1;
int i, j;
for(i=0; i<sizeof(t)/sizeof(t[0]); i++)
{
if (xmax < t[i].x) xmax=t[i].x;
if (ymax < t[i].y) ymax=t[i].y;
}
m = (int*)malloc((xmax+1)*(ymax+1)*sizeof(int));
memset(m, 0, (xmax+1)*(ymax+1)*sizeof(int));
for(i=0; i<sizeof(t)/sizeof(t[0]); i++)
{
*(m+(t[i].y-1)*ymax+t[i].x-1) = t[i].n;
}
printf("\n");
for(i=0;i<ymax;i++)
{
for(j=0; j<xmax; j++)
{
printf("%d ", *(m+i*ymax+j));
}
printf("\n");
}
free(m);
return 0;
}
H. c语言中的三元组的操作问题!!!
&本身表示引用,如此写会更明白 int*&,就是一个指向整形指针的引用。
这个引用起什么作用呢?它可以让T保留在函数中的改变。考虑如下程序:
typedef int ElemType;
typedef ElemType *Triplet;
void test(Triplet& T)
{
cout << *T << endl;
int two = 2;
T = &two;
cout << *T << endl;
}
int main()
{
int one = 1;
Triplet T = &one;
test(T);
cout << *T << endl;
return 0;
}
其结果为 1 2 2;
如果去掉&,结果为 1 2 1。
也就是说,用了&,T在函数的局部区域里,相当于一个全局变量,而不是局部变量。被改变后的值保留了下来。如果没有&,T在函数中被复制了一份,只作用于局部区域。
《Effective C++》的作者如是说:在C++底层实现中,&其实最终是用指针实现的。
I. 用C语言怎么编程 三元组
可以用结构体实现
struct three{
//第一部分
//第二部分
//第三部分
}