1、数组与广义表的算法实验工具:visual C+实验内容:1、三元组表示稀疏矩阵的转置算法(一般typedef structint i,j;ElemType e;Triple;typedef structTriple dataMAXSIZE+1; /非零元三元组int rposMAXRC+1; /各行第一个非零元的位置表int mu,nu,tu; /矩阵的行数、列数和非零元个数RLSMatrix;CreateSMatrix(RLSMatrix ElemType e;int k,j;printf(“输入矩阵的行数、列数、非零元的个数:“);scanf(“%d%d%d“,M.data0.i=0;fo
2、r(i=1;i3) /控制跳出死循环printf(“本次输入失败!“);return ERROR;printf(“按行序输入第%d 个非零元素所在的行(1%d)列(1%d) 值:“,i,M.mu,M.nu);scanf(“%d%d%d“,k=0;if(mM.mu|nM.nu) /行或列超出范围k=1;if(m#include#define Size 2501# define Size1 51typedef structint i;int j;int e;/非零元的值triple; /定义三元组typedef structtriple dataSize+1;/矩阵中的元素int ropsSize
3、1+1;/ ropsi为第 i 行元素中的首非零元在 data中的序号int mu;/行数int nu;/列数int tu;/非零元数 juzhen;/定义矩阵typedef struct node/ 定义十字链表元素int i,j,e;struct node *right,*down;/ 该非零元所在行表和列表的后继元素 node,*link;typedef struct / 定义十字链表对象结构体 link *rhead,*chead;/行和列的头指针int m,n,t;/ 系数矩阵的行数,列数,和非零元素个数 crosslist;void createcross(crosslist no
4、de *p,*q;printf(“输入行,列和非零元数,空格隔开:n“);scanf(“%d %d %d“,M.rhead=(link *)malloc(M.m+1)*sizeof(link);/给行和列的头指针分配内存M.chead=(link *)malloc(M.n+1)*sizeof(link);for(k=1;ki=i;p-j=j;p-e=e;if(M.rheadi=NULL|M.rheadi-jj)/插入元素所在行无非零元或首非零元的列标大于插入元素的列标p-right=M.rheadi;M.rheadi=p;else for(q=M.rheadi;(q-right)/空循环找到第
5、一个列标大于或等于插入元素列标的元素p-right=q-right;q-right=p;if(M.cheadj=NULL|(M.cheadj-ii)/插入元素所在列无非零元或首非零元的行标大于插入元素的行标p-down=M.cheadj;M.cheadj=p;elsefor(q=M.cheadj;(q-down)/空循环找到第一个行标大于或等于插入元素行标的元素p-down=q-down;q-down=p;void printcross(crosslist A)/输出十字链表if(A.m=0)printf(“十字链表为空!n“);elseprintf(“十字链表为:n“);int i,j;fo
6、r(i=1;ij) printf(“%5d“,p-e);p=p-right; elseprintf(“%5d“,0); printf(“n“);printf(“n“);crosslist addcross()printf(“十字链表加法:n“);crosslist a,b;/ 创建两个十字链表对象,并初始化createcross(a);createcross(b);node *pre,*h51,*pa,*pb,*q;/定义辅助指针,pa,pb 分别为 a,b 当前比较的元素,pre 为 pa 的前驱元素 int i,j,k=0,m,n; /hj指向 j 列的当前插入位置if(a.m!=b.m|
7、a.n!=b.n)printf(“格式不对,不能相加!n“);elsefor(i=1;ii=pb-i;p-j=pb-j;p-e=pb-e;if(pa=NULL|pa-jpb-j)/当 a 此行已经检查完或者 pb 因该放在 pa前面if (pre=NULL)a. rheadp-i=p;else pre-right=p;p-right=pa;pre=p;if (hp-j=NULL)/当前插入位置下面无非零元/因为是逐行处理,so,hp-j,依次下移/因此每次都是指向插入的位置 a. chead p-j= p; p-down = NULL;else p-down = hp-j-down;hp-j-
8、down = p;hp-j=p;/*hp-j下移指向下次插入的位置pb=pb-right;/pb 指向该行下个元素else if(pahpa-j=pa;/移动 h,使其指向下次插入的位置pa = pa-right;else if(pa-j=pb-j)pa-e+=pb-e;if(pa-e)/不为零pre=pa;hpa-j=pa;pb=pb-right;/加else/pa-e 为零,删除节点if (pre =NULL)a.rhead pa-i=pa-right;else pre-right=pa-right;p=pa;/p 指向 pa,用来在下面修改列指针pa=pa-right;if (h p-j
9、=NULL) a.chead p-j=p-down;else hp-j-down=p-down;free(p);pb=pb-right;return a;void multycross(crosslist crosslist a,b;link *r;int i,j,k,e;printf(“十字链表乘法:n“);createcross(a);createcross(b);if(a.n!=b.m)printf(“格式错误,不能相乘!n“);else c.m=a.m;c.n=b.n;c.t=0;c.rhead=(link *)malloc(a.m+1)*sizeof(link);/给行和列的头指针分
10、配内存c.chead=(link *)malloc(b.n+1)*sizeof(link);for(k=1;ke=0;u-i=0;u-j=0;for(k=1;ke=0;v-i=i;v-j=j;while(pelse if(p-ji)p=p-right;elsev-e+=p-e*q-e;p=p-right;q=q-down;if(v-e)/如果不为零,则插入 c 矩阵中/同建立十字链表if(c.rheadi=NULL|c.rheadi-jj)/插入元素所在行无非零元或首非零元的列标大于插入元素的列标v-right=c.rheadi;c.rheadi=v;else for(p2=c.rheadi;
11、(p2-right)/空循环找到第一个列标大于或等于插入元素列标的元素v-right=p2-right;p2-right=v;if(c.cheadj=NULL|c.cheadj-ii)/插入元素所在列无非零元或首非零元的行标大于插入元素的行标v-down=c.cheadj;c.cheadj=v;elsefor(p2=c.cheadj;(p2-down)/空循环找到第一个行标大于或等于插入元素行标的元素v-down=p2-down;p2-down=v;void create(juzhen printf(“输入矩阵行数和列数 and 非零元的个数,以空格隔开 :n“);scanf(“%d %d %
12、d“,printf(“输入矩阵非零元的行,列,和数值(中间空格隔开):n“);for(i=1;iB.datak2.i)/同上C.datak+=B.datak2+;else/datak1,datak2行标相同if(A.datak1.jB.datak2.j)/datak1列标大于 datak2列标,则把datak2的值赋给 datakC.datak+=B.datak2+;else if(A.datak1.j#include #include#define maxlen 100typedef char ElemType;typedef struct GLode/广义表结构体的定义int tag;un
13、ionElemType atom;struct GLode *hp; val;struct GLode *tp; GList;typedef struct /栈结构的定义ElemType datamaxlen ;int top;SeqStack;/生成广义表GList *CreateGL(char *char ch;ch=*s; s+; if (ch!=0) h=(GList *)malloc(sizeof(GList);if (ch=() h-tag=1;h-val.hp=CreateGL(s);else if (ch=)h=NULL;elseh-tag=0;h-val.atom=ch;el
14、seh=NULL; ch=*s;s+;if (h!=NULL)if (ch=,) h-tp=CreateGL(s); else h-tp=NULL; return h; /遍历广义表void DispGL(GList *g)if (g!=NULL)if (g-tag=1) printf(“(“); if (g-val.hp=NULL)printf(“);elseDispGL(g-val.hp); elseprintf(“%c“, g-val.atom); if (g-tag=1)printf(“)“);if (g-tp!=NULL)printf(“,“);DispGL(g-tp); /求广义表
15、的深度int GLDepth(GList *g) int max=0,dep;if (g-tag=0)return 0;g=g-val.hp;if (g=NULL)return 1;while (g!=NULL)if (g-tag=1)dep=GLDepth(g);if (depmax)max=dep;g=g-tp;return(max+1);/求广义表的表尾GList *tail(GList *g) GList *p=g-val.hp;GList *t;if (g=NULL)printf(“空表不能求表尾n“);return NULL;else if (g-tag=0)printf(“原子不
16、能求表尾n“);return NULL;p=p-tp;t=(GList *)malloc(sizeof(GList);t-tag=1;t-tp=NULL;t-val.hp=p;return t;/查找函数void FindGListX(GList *g,char x,int elseif(g-tag = 1) FindGListX(g-val.hp,x,mark);FindGListX(g-tp,x,mark);/求广义表的逆表void NIGList(GList *g,SeqStack *s)if(g!=NULL)if (g-tag=1)s-top+;s-datas-top=);if (g-
17、val.hp=NULL)printf(“);elseNIGList(g-val.hp,s); elses-top+;s-datas-top=g-val.atom;if (g-tag=1)s-top+; s-datas-top=(; if (g-tp!=NULL)s-top+;s-datas-top=,; NIGList(g-tp,s); /广义表的输出void Pop(SeqStack *s) while(s-top=0) printf(“%c“,s-datas-top);s-top-;/以下主函数用于调试void main()GList *g,*gt;printf(“请输入一个广义表: 如(
18、a,b),c)n“);char str30;char x; int y=0,mark,xz=1;system(“color 0c“); /调用系统命令,改变运行时的字体颜色SeqStack *k;k=(SeqStack *)malloc(sizeof(SeqStack);k-top=-1; char *s=gets(str);g=CreateGL(s); printf(“你输入的广义表为:n“);while(xz)DispGL(g);printf(“n“);printf(“*广义表的运算*n“);printf(“=n“);printf(“* 1.广义表的查找 *n“);printf(“* 2.
19、求广义表表尾 *n“);printf(“* 3.求广义表深度 *n“);printf(“* 4.求广义表逆表 *n“);printf(“* 0.退出表的运算 *n“);printf(“=n“);printf(“请 选 择:(05)n“);scanf(“%d“,switch (y)case 1: printf(“请输入要查找的元素:“);mark=0;getchar();scanf(“%c“,FindGListX(g,x,mark); if (mark)printf(“_该元素存在于您输入的表中!n“);elseprintf(“T_T 对不起,没有找到该元素!n“);break;case 2:
20、gt=tail(g);printf(“表尾:“);DispGL(gt);printf(“n“);break;case 3: printf(“广义表的深度:%dn“,GLDepth(g);break;case 4: printf(“所求广义表的逆表为:n“);NIGList(g,k); Pop(k); printf(“n“);break;default : system(“cls“); /*调用系统命令 CLS,实现清屏*/printf(“再见,欢迎再次使用!n“);return ;printf(“是否继续:1.继续 ;0.停止n“);printf(“请选择:“);scanf(“%d“,if(xz=1)system(“cls“);elsesystem(“cls“);printf(“再见,欢迎再次使用!n“);运行结果:(1) 创建广义表 (2)广义表的查找(3)广义表表尾 (4)广义表的深度(5)广义表的逆表