数据结构实验四A
山东大学数据结构第四次实验实验报告

实验4 排序的编程与实现实验目的:掌握常用的排序方法,并掌握C语言实现排序算法的方法;了解各种排序方法过程及依据原则,并掌握各种排序方法的时间复杂度和稳定性的分析方法。
实验原理:参照课本p.220页内容中的 Figure7.2;课本p.223页内容中的Figure7.4;p.228,Figure7.8;p.232-233, Figure7.9-7.10; p240-243, Figure 7.12-7.15.实验内容:统计成绩【问题描述】:给出n个学生的考试成绩表,每条信息由姓名和分数组成,利用排序算法完成以下任务:1)按照分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次。
2)按照名次列出每个学生的姓名和分数【要求】学生的考试成绩需要从键盘输入数据建立,同时要设计输出格式。
实验要求:1)能够采用常用的排序算法中的一种实现以上两个任务;实验步骤:一、实验源程序#include<stdio.h>#include <string.h>#include<stdlib.h>#include <conio.h>void Input(int n); \\实现从键盘输入学生姓名和分数的功能void Ranking(int n); \\实现根据学生成绩进行排序的功能struct student \\结构体,存放学生姓名及分数{char name[8];int score;} R[101];int main ( ) \\主程序{int x;printf("请输入需要录入信息的学生个数(不超过100): ");scanf ("%d",&x);Input(x);printf("学生成绩排名如下:\n ");printf(" 排名学生姓名成绩\n ");Ranking(x);getch();return 0;}void Input(int n) \\从键盘输入学生姓名和分数{int i;printf("请输入学生的姓名和成绩: \n");for (i=0; i<n; i++){printf ("学生姓名:");scanf ("%s", R[i].name);printf ("此学生的成绩:");scanf ("%d", &R[i].score);}}void Ranking(int n) \\根据学生成绩进行排序{int num=1,number=0, i, j, max=0;for (i=0; i<n; i++) \\外循环,将学生成绩从高到低进行排序{max=i;for (j=i+1; j<n; j++){if (R[j].score>R[i].score) \\内循环,如果排在后面的分数高于前面的,则进行结构体内容互换{max=j;R[100]=R[max];R[max]=R[i];R[i]=R[100];}}number=number+1; \\记录学生排名名次if ((i>0)&&(R[i].score<R[i-1].score)){num=number;}if(num==1)printf(" %3d %s%6d\n", num, R[i].name, R[i].score);elseprintf(" %4d %s%6d\n", num, R[i].name, R[i].score);}}二、实验结果①从键盘上输入学生姓名和分数信息,这里选择输入5个学生信息(上限人数程序中已经设置为100)。
数据结构实验四报告

实验日期:_______________ 实验指导老师:
实验4 无向图的深度优先搜索
一、实验目的和实验环境
【实验目的】
1、了解图的定义、特点,区分无向图和有向图的概念;
2、了解图的数据结构和搜索方法;
3、掌握无向图的邻接矩阵、邻接表的表示方法;
4、写出无向图的深度优先搜索程序。
【实验环境】VC++6.0
二、理论依据
邻接多重表是无向图的一种很有效链式存储结构,在邻接表中容易求得顶点和边的各种信息。
除了在边结点中增加一个标志域外,邻接多重表所需的存储量和邻接表相同。
三、实验内容
设无向图G有n个点e条边,写一算法建立G的邻接多表,并按照深度优先搜索输出顶点,要求该算法时间复杂性为O(n+e),且除邻接多表本身所占空间之外只用O(1)辅助空间。
四、实验步骤
1、了解图的定义、特点,区分无向图和有向图的概念;
2、了解图的数据结构和搜索方法;
3、掌握无向图的邻接矩阵、邻接表的表示方法;
4、写出无向图的深度优先搜索程序
五、实验结果
1.源代码如下:
实验日期:_______________ 实验指导老师:
2.运行界面截图如下:
六、小结
1、在创建邻接多重表时,由于邻接多重表的数据类型为字符型,键盘输入总是很难控制。
这时可以通过人为设置函数过滤去键盘输入中的空格。
2、在邻接多重表上,各种基本操作的实现和邻接表相似。
3、在邻接多重表中,所有依附于同一顶点的边串联在同一链表中。
数据结构实验报告4(中央电大)

实验报告(四)专业名称 课程名称批改教师主持教师实验成绩校外评阅教师实验名称 图的存储方式和应用使用主要设备 PC, VC++6.0 实验要求 1.掌握图的存储结构,了解它的应用; 2.理解图的"最短路径"计算方法,了解相关的程序设计技术。
实验报告内容:实验4.1 建立图的邻接矩阵图4-1* 设计程序代码如下:#include<stdio.h>#define MaxVertexNum 5#define MaxEdgeNum 20#define MaxValue 1000typedef int VertexType;typedef VertexType vexlist [MaxVertexNum];typedef int adjmatrix [MaxVertexNum] [MaxVertexNum];void Createl(vexlist Gv,adjmatrix GA,int n,int e){int i,j,k,w;printf("输入%d个顶点数据\n",n);for(i=0;i<n;i++) scanf("%d",&Gv[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j) GA[i][j]=0;else GA[i][j]=MaxValue;}Printf("输入一条边的两端点序号i和j及边上的权w\n");printf("输入%d条无向带权边\n",e);for(k=1;k<=e;k++){scanf("%d%d%d",&i,&j,&w);GA[i][j]=GA[j][i]=w;}}void main(){vexlist vl;adjmatrix a;Createl(vl,a,5,8);}????????1。
数据结构实验报告4

数据结构实验报告——实验4学号::得分:______________一、实验目的1、复习线性表的逻辑结构、存储结构及基本操作;2、掌握顺序表和(带头结点)单链表;3、了解有序表。
二、实验容1、(必做题)假设有序表中数据元素类型是整型,请采用顺序表或(带头结点)单链表实现:(1)OrderInsert(&L, e, int (*compare)(a, b))//根据有序判定函数compare,在有序表L的适当位置插入元素e;(2)OrderInput(&L, int (*compare)(a, b))//根据有序判定函数compare,并利用有序插入函数OrderInsert,构造有序表L;(3) OrderMerge(&La, &Lb, &Lc, int (*compare)())//根据有序判定函数compare,将两个有序表La和Lb归并为一个有序表Lc。
2、(必做题)请实现:(1)升幂多项式的构造,升幂多项式是指多项式的各项按指数升序有序,约定系数不能等于0,指数不能小于0;(2)两个升幂多项式的相加。
三、算法描述(采用自然语言描述)1.创建带头节点的链表,输入两个有序表数据La Lb归并两个有序表得有序表Lc输出三个有序表输入需插入数据e将e插入有序表Lc输出插入e后的Lc2.创建链表按指数升序输入多项式得序数和指数输出多项式按指数升序输入第二个多项式得序数和指数两个多项式相加输出第二个多项式和两个多项式得和四、详细设计(画出程序流程图)1.2.五、程序代码(给出必要注释)1.#include<stdio.h>#include<malloc.h>typedef struct LNode{int date;struct LNode *next;} LNode,*Link;typedef struct LinkList{Link head;//头结点int lenth;//链表中数据元素的个数} LinkList;int compare (LinkList *L,int e)//有序判定函数 compare {int Lc=0;Link p;p=L->head;p=p->next;while(p!=NULL){if(e>p->date){p=p->next;Lc++;}elsereturn Lc;}return Lc;}void OrderInsert (LinkList *L,int e,int (*compare)())//根据有序判定函数compare,在有序表L 的适当位置插入元素e;{Link temp,p,q;int Lc,i;temp=(Link)malloc(sizeof(LNode));temp->date=e;p=q=L->head;p=p->next;Lc=(*compare)(L,e);if(Lc==L->lenth){while(q->next!=NULL){q=q->next;}q->next=temp;temp->next=NULL;}else{for(i=0; i<Lc; i++){p=p->next;q=q->next;}q->next=temp;temp->next=p;}++L->lenth;}void OrderMerge (LinkList *La,LinkList *Lb,int (*compare)())//根据有序判定函数 compare ,将两个有序表 La 和 Lb 归并为一个有序表{int i,Lc=0;Link temp,p,q;q=La->head->next;while(q!=NULL){p=Lb->head;temp=(Link)malloc(sizeof(LNode));temp->date=q->date;Lc=(*compare)(Lb,q->date);if(Lc==Lb->lenth){while(p->next!=NULL){p=p->next;}p->next=temp;temp->next=NULL;}else{for(i=0; i<Lc; i++){p=p->next;}temp->next=p->next;p->next=temp;}q=q->next;++Lb->lenth;}}LinkList *Initialize (LinkList *NewList){int i;Link temp;NewList=(LinkList *)malloc((2+1)*sizeof(LinkList));for(i=0; i<2+1; i++){temp=(Link)malloc(sizeof(LNode));temp->date=0;temp->next=NULL;(NewList+i)->head=temp;(NewList+i)->lenth=0;}return NewList;}void Insert (LinkList *NewList){int a,i;char c;printf("在第1个表中插入数据,输入“ N ”再对下个表插入数据 \n");for(i=0; i<2; i++){while(1){scanf("%d",&a);c=getchar();if(c=='N'){if(i<2-2)printf("在第 %d个表中插入数据,输入“ N ”再对下个表插入数据 \n",i+2); else if(i==2-2)printf("在第 %d个表中插入数据,输入“ N ”结束。
数据结构实验四

数据结构实验报告第四次实验一、实验目的1、复习线性表的逻辑结构、存储结构及基本操作;2、掌握顺序表和(带头结点)单链表;3、了解有序表。
二、实验内容1、(必做题)假设有序表中数据元素类型是整型,请采用顺序表或(带头结点)单链表实现:(1)OrderInsert(&L, e, int (*compare)(a, b))//根据有序判定函数compare,在有序表L 的适当位置插入元素e;(2)OrderInput(&L, int (*compare)(a, b))//根据有序判定函数compare,并利用有序插入函数OrderInsert,构造有序表L;(3)OrderMerge(&La, &Lb, &Lc, int (*compare)())//根据有序判定函数compare,将两个有序表La 和Lb 归并为一个有序表Lc。
2、(必做题)请实现:(1)升幂多项式的构造,升幂多项式是指多项式的各项按指数升序有序,约定系数不能等于0,指数不能小于0;(2)两个升幂多项式的相加。
三、算法描述(采用自然语言描述)1、创建带头节点的链表,输入两个有序表数据La、Lb,归并两个有序表得有序表Lc,输出三个有序表。
输入需插入数据e,将e 插入有序表Lc,输出插入e 后的Lc。
2、创建链表,按指数升序输入多项式得序数和指数,输出多项式。
按指数升序输入第二个多项式得序数和指数,两个多项式相加,输出第二个多项式和两个多项式的和。
四、详细设计(画出程序流程图)1、2、五、程序代码(给出必要注释)1、#include<stdio.h>#include<malloc.h>typedef struct LNode{int date;struct LNode *next;}LNode,*Link;typedef struct LinkList{Link head;int lenth;}LinkList;int compare (LinkList *L,int e) {int Lc=0;Link p;p=L->head;p=p->next;while(p!=NULL){if(e>p->date){p=p->next;Lc++;}elsereturn Lc;}return Lc;}void OrderInsert (LinkList *L,int e,int (*compare)()){Link temp,p,q;int Lc,i;temp=(Link)malloc(sizeof(LNode));temp->date=e;p=q=L->head;p=p->next;Lc=(*compare)(L,e);if(Lc==L->lenth){while(q->next!=NULL){q=q->next;}q->next=temp;temp->next=NULL;}else{for(i=0; i<Lc; i++){p=p->next;q=q->next;}q->next=temp;temp->next=p;}++L->lenth;}void OrderMerge (LinkList *La,LinkList *Lb,int (*compare)()){int i,Lc=0;Link temp,p,q;q=La->head->next;while(q!=NULL){p=Lb->head;temp=(Link)malloc(sizeof(LNode));temp->date=q->date;Lc=(*compare)(Lb,q->date);if(Lc==Lb->lenth){while(p->next!=NULL){p=p->next;}p->next=temp;temp->next=NULL;}else{for(i=0; i<Lc; i++){p=p->next;}temp->next=p->next;p->next=temp;}q=q->next;++Lb->lenth;}}LinkList *Initialize (LinkList *NewList){int i;Link temp;NewList=(LinkList *)malloc((2+1)*sizeof(LinkList));for(i=0; i<2+1; i++){temp=(Link)malloc(sizeof(LNode));temp->date=0;temp->next=NULL;(NewList+i)->head=temp;(NewList+i)->lenth=0;}return NewList;}void Insert (LinkList *NewList){int a,i;char c;printf("在第1 个表中插入数据,输入“N ”再对下个表插入数据\n");for(i=0; i<2; i++){while(1){scanf("%d",&a);c=getchar();if(c=='N'){if(i<2-2)printf("在第%d 个表中插入数据,输入“N ”再对下个表插入数据\n",i+2);else if(i==2-2)printf("在第%d 个表中插入数据,输入“N ”结束。
数据结构实验四实验报告

桂林电子科技大学2014-2015学年 第2学期数据结构 实验报告实验名称 实验四 树辅导教师意见:成绩 教师签名:院 系 计算机科学与工程学院 专业 软件工程学 号 1300330129 姓名 张涛 同 作 者 实验日期2015 年 06 月 26 日一、实验目的1.了解树二、实验具体内容1、实验题目1:(1)题目 树(2)分析实验代码:#include<iostream>#include<stdio.h>#include<conio.h>using namespace std;typedef struct btnode {int data;btnode *Lchild,*Rchild;}*Btnode;void Creat(Btnode & t) {int ch; cin>>ch;if(ch==0) t=NULL;else {btnode *p=new btnode;p->data=ch; t=p;Creat(t->Lchild);Creat(t->Rchild);} }void Preorder(Btnode & p) {if(p!=NULL) {cout<<p->data<<",";Preorder(p->Lchild);Preorder(p->Rchild); } } void Midorder(Btnode & p) {if(p!=NULL) {Midorder(p->Lchild);cout<<p->data<<",";Midorder(p->Rchild); } } void Folorder(Btnode & p) {if(p!=NULL) {Folorder(p->Lchild);Folorder(p->Rchild);cout<<p->data<<","; }} void main() {btnode *head=new btnode;cout<<"请输入数据:";Creat(head);cout<<"前序遍历:";Preorder(head);cout<<endl;cout<<"中序遍历:";Midorder(head);cout<<endl;cout<<"后序遍历:";Folorder(head);getch(); }三、实验小结。
数据结构实报告实验四

数据结构实验报告专业:信科10-4姓名:纵兆丹学号:08103575一、实验目的1 熟练掌握顺序搜索、折半搜索和索引搜索等基本搜索算法,熟悉这些算法适合在何种存储结构下实现;2 熟练掌握二叉排序树的特性、建立方法以及动态搜索算法;3 熟练掌握散列表的特点及构造方法。
二、实验内容基本题1、实现基于有序顺序表的折半搜索。
2、设单链表的结点是按关键字的值从小到大排列的,试写出对此表的搜索程序并调试。
三、实验过程和方法1、程序代码基础题1#include <iostream.h>#include <conio.h>int Search_Bin(int *a,int key,int n){//在有序表a中折半查找其关键字等于key的数据数据元素,若找到,则函数值为//该元素在表中的位置,否则为0int low=1;int high=n;int mid;while(low<=high){mid = (low+high)/2;if(key==a[mid])return mid;else if(key<a[mid])high=mid-1;elselow=mid+1;}return 0;}//Search_Binvoid main(){int a[11];int x;for(int i=1;i<=10;i++){a[i]=i;}cout<<"请输入您想查找的元素值(请在1—10中选择):"<<endl;cin>>x;cout<<"您输入的元素的位置为:"<<endl;cout<<Search_Bin(a,x,10)<<endl;getch();}基础题2#include <iostream>#include <conio.h>#include <list>using namespace std;void disp(list<int> List){list<int>::iterator a;for(a=List.begin(); a != List.end(); a++)cout<<*a<<" ";cout<<endl;}//dispint Search(list<int> List,int key){list<int>::iterator b;int i=1;for(b=List.begin(); b!= List.end(); b++){if(key==*b){return i;}i++;}return 0;}//Searchvoid main(){list<int> L;int m[100];int i=0;cout<<"请输入您要建立的链表的各个节点的关键字,以0为结束!"<<endl; do{cin>>m[i++];}while(m[i-1]!=0);for(int j=0;j<i-1;j++){L.push_back(m[j]);cout<<"插入成功!"<<endl;}L.sort();cout<<"单链表节点顺序为:"<<endl;disp(L);int n,x;do{cout<<"1,查找;2,退出。
数据结构-实验4

《数据结构》实验报告年级_2012级__ 学号_ 姓名 __ 成绩______专业_计算机科学与技术实验地点___指导教师__实验项目实验四串实验性质设计性实验日期:一、实验目的:1、掌握串的定义及其基本操作的实现。
2、掌握链表及其基本操作的实现。
3、通过上机实践进一步加深对串的顺序存储方式及链式存储方式的理解。
4、通过上机实践加强利用数据结构解决实际应用应用问题的能力。
二、实验内容与要求:1、实验题目一:顺序串的定义及其操作算法的实现要求:编程实现串的类型定义及串的初始化操作、插入操作、删除操作、取元素操作、输出操作等,并对其进行验证。
2、实验题目二:文本加密和解密要求:掌握每一种串操作的一般函数的实现及其应用。
三、实验问题描述一个文本串可用事先给定的字母映射表进行加密。
例如,设字母映射表为:abcdefghijklmnopqrstuvwxyzngzqtcobmuhelkpdawxfyivrsj则字符串“encrypt”被加密为“tkzwsdf”。
设计一个程序将输入的文本串进行加密后输出,然后进行解密输出。
四、实验步骤1.实验问题分析这里用到了c语言里的while 语句、for语句、if语句以及指针2.功能(函数)设计void Encrypt(char *pszSrc, char *pszEncrypt){char *p1;char *p2;int i=0;int j=0;p1=(char *)CharArray1;p2=(char *)CharArray2;cout<<"请输入要加密的字符串\n";fflush(stdin);cin.getline(pszSrc, 100);}五、实验结果(程序)及分析#include<iostream>using namespace std;const char CharArray1[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};const char CharArray2[26]={'n','g','z','q','t','c','o','b','m','u','h','e','l','k','p','d','a','w','x','f','y','i','v','r','s','j'};void Encrypt(char*pszSrc,char*pszEncrypt){char*p1;char*p2;int i=0;int j=0;p1=(char*)CharArray1;p2=(char*)CharArray2;cout<<"请输入要加密的字符串\n";fflush(stdin);cin.getline(pszSrc,100);i=0;j=0;while(*(pszSrc+i)!='\0'){for(j=0;j<26;j++){if(*(pszSrc+i)==*(p1+j)){*(pszEncrypt+i)=*(p2+j);break;}else{;}}i++;}*(pszEncrypt+i)='\0';}void Decrypt(char*pszSrc,char*pszDecrypt) {char*p1;char*p2;int i=0;int j=0;p1=(char*)CharArray1;p2=(char*)CharArray2;cout<<"请输入一行已加密的字符串:\n"; fflush(stdin);cin.getline(pszSrc,100);i=0;j=0;while(*(pszSrc+i)!='\0'){for(j=0;j<26;j++){if(*(pszSrc+i)==*(p2+j)){*(pszDecrypt+i)=*(p1+j);break;}else{;}}i++;}*(pszDecrypt+i)='\0';}int main(){char*pszSrc;char*pszDest;int select;int i=0;int j=0;if((pszSrc=new char[100])==NULL){cout<<"申请内存空间失败,程序退出!\n";exit(1);}if((pszDest=new char[100])==NULL){cout<<"申请内存空间失败,程序退出!\n";exit(1);}while(1){cout<<"请选择加密或解密(1.加密2.解密0.退出):";cin>>select;if(1==select){Encrypt(pszSrc,pszDest);cout<<"加密后的字符串\n";i=0;while(*(pszDest+i)!='\0'){cout<<*(pszDest+i);i++;}cout<<endl;}else if(2==select){Decrypt(pszSrc,pszDest);cout<<"解密后的字符串\n";i=0;while(*(pszDest+i)!='\0'){cout<<*(pszDest+i);i++;}cout<<endl;}else if(0==select){break;}else{cout<<"你没有输入正确的选择,请重新选择:";}}delete[]pszSrc;delete[]pszDest;return0;}六、结论与分析在本次实验中掌握了串的各种操作,以及其实际作用,掌握串的定义及其基本操作的实现和掌握链表及其基本操作的实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构与算法分析》
实验报告书
学期:2014 - 2015 学年第 2 学期
班级:信息管理与信息系统2班
学号: 1310030217 姓名:田洪斌
实验类别:(★)基础型()设计型
实验时间:
成绩:
信息管理系
一、实验内容
实现程序,基于对称矩阵的压缩存储表示方法,实现对于以整数数据为数据元素的对称矩阵的压缩存储及按行、列下标查询特定元素等操作。
二、实验目的
1、掌握特殊矩阵的压缩存储思路和方法以及操作特点;
2、掌握特殊矩阵的存储方法以及常见操作在C语言环境中的实现方法;
3、掌握稀疏矩阵的压缩存储思路和方法以及操作特点;
4、掌握稀疏矩阵的存储方法以及常见操作在C语言环境中的实现方法;
三、需求分析
用线性表的链式结构表示来完成输入、编辑、调试、运行的全过程。
并规定:
a.手动输入行数、列数和非零元的个数
b.程序可以输入、调试、运行、显示
c.测试数据:n个顶点的行号、列号以及值
四、系统设计
1.数据结构设计
使用三元组顺序表实现稀疏矩阵的定义,稀疏矩阵的三元组顺序表的存储用的是结构体在这个结构体中行标和列标使用整型定义,而一维数组采用的是结构体这样子做方便后面功能的实现。
在整个程序中函数与函数之间采用的是调用的关系,这样是为了使程序模块化,方便以后的维护。
2.程序结构设计
(1)程序中主要函数功能:
void CreateTriTupleTable(TriTupleTable *T)/////////////////////////////////////////////稀疏矩阵的创建
void Traverse(TriTupleTable *T)///////////////////////////////////////////////////////////////稀疏矩阵的显示
void menu()/////////////////////////////////////////////////////////////////////////////////////////////菜单
void main()//////////////////////////////////////////////////////////////////////////////////////////////主函数(2)函数调用关系
见图4-1
图4-1 函数关系图
五、 调试分析
a. 算法和函数中出现了一些系统无法识别的变量,照成程序出现了错 误。
原因是没有注意算法与源程序的区别。
算法是简单的对源程序进行描述
的,是给人阅读的,所以有些变量没有定义我们就能看懂。
而程序中的变量一定要先定义才能够被引用,才能被计算机识别。
b. 在调试过程中遇到问题是利用C++程序进行调试的,找出错误并改正。
c. 学会如何调用函数。
d. 学会稀疏矩阵的存储方法以及常见操作在C 语言环境中的实现方法。
六、 测试结果
1.运行时输入正确密码进入主界面,系统根据输入的数字选项来调用相应的函数。
主要实现“功能选择”的界面,在这个界面里有显示系统的五大功能,根据每个功能前面的序号进行选择。
以下为该界面:
main
CreateT riTupleT able(Tri TupleTa
ble *T)
Travers e(TriTu pleTable
*T)
meun()
图4-2 主界面
2.当选择1录入完成输入时,运行结果如下图:
图4-3 稀疏矩阵的创建
3.当录入完成输入显示稀疏矩阵时,运行结果如下图:
图4-4稀疏矩阵的显示
七、经验和体会
本次试验利用C语言编程,完成了三元组表的建立、三元组表的输出、三元组表的转置,函数之间的调用,提升了我的C语言编程能力,同时也加深了我对数据结构中关于线性表结构有关基础概念、基本算法的理解,同时,通过程序的调试及观察分析程序运行的情况,也进一步增加了我调试程序的经验,并使我认识到了线性表的结构。
八、程序源代码
#include <stdio.h>
#define MaxSize 100
/////////////////////////////////三元组表的存储方式
typedef int DataType;
typedef struct {
DataType v;
int i, j;
}TriTupleNode;
typedef struct {
TriTupleNode data[MaxSize+1]; //三元组数组
int m, n, t; //行数列数以及非零元个数
}TriTupleTable;
/////////////////////////////////////////////稀疏矩阵的创建
void CreateTriTupleTable(TriTupleTable *T)
{
//int m, n, t;
int i;
printf("输入行数,列数以及非零元的个数:");
scanf("%d,%d,%d", &T->m, &T->n, &T->t);
for (i=1; i<=T->t; ++i)
{
printf("请输入第%d个顶点的行号列号以及值", i);
scanf("%d,%d,%d", &T->data[i].i, &T->data[i].j, &T->data[i].v);
}
}
///////////////////////////////////////////////稀疏矩阵的显示
void Traverse(TriTupleTable *T)
int i;
printf("%d %d %d\n", T->m, T->n, T->t);
for (i=1; i<=T->t; ++i)
{
printf("%d %d %d\n", T->data[i].i, T->data[i].j, T->data[i].v);
}
}
/////////////////////////////////////////////////稀疏矩阵的转置
void TransMatrix(TriTupleTable *A, TriTupleTable *B)
{
int p, q, col;
B->m = A->n;
B->n = A->m;
B->t = A->t;
if (B->t!=0)
{
q = 1;
for (col=1; col<A->n; ++col)
for (p=1; p<A->t; ++p)
{
if (A->data[p].j == col)
{
B->data[q].i = A->data[p].j;
B->data[q].j = A->data[p].i;
B->data[q].v = A->data[p].v;
++q;
}
}
}
}
///////////////////////////////////菜单
void menu()
printf("\n**********************【菜单】*********************\n");
printf("\n\t\t【1】:稀疏矩阵的创建");
printf("\n\t\t【2】:稀疏矩阵的显示");
printf("\n\t\t【3】:稀疏矩阵的转置");
printf("\n\t\t【4】:稀疏矩阵的显示");
printf("\n\t\t【5】:退出系统");
}
//////////////////////////////////主函数
void main(void)
{
TriTupleTable A, B;
int x=1,y;
menu();
while(x)
{
printf("\n请选择菜单\n");
scanf("%d",&y);
switch(y)
{
case 1: CreateTriTupleTable(&A); break;
case 2:Traverse(&A);break;
case 3:TransMatrix(&A,&B);break;
case 4:Traverse(&B);break;
case 5:x=0;break;
}
}
}。