第5章 数组和广义表要点:

1、掌握数组元素存储位置的换算;

2、了解特殊矩阵地存储方法和元素存储位置计算;

3、了解广义表的长度、深度、head、tail等概念和操作和存储结构。

教材习题解答:

5.1 288,1282,1126,1192(注:如果数组元素的下标从1开始则第3,4项的答案不同)

5.2 k = 2i+j-2

I = k/3 + 1

j = k – 2(k/3)

5.3

//p112 习题5.3 假设稀疏矩阵A和B均以三元组表作为存储结构。试写出矩阵

//相加的算法,另设三元组C存放结果矩阵。

#include

#define MAXSIZE 100

typedef struct

{

int row,col;

int e;

}Triple;

typedef struct

{

Triple data[MAXSIZE+1];

int m,n,len;

}TSMatrix;

void Input(TSMatrix *pA)

{

int nrow,ncol,num,elem,i;

printf("请输入矩阵的行数、列数和非零元素个数:");

scanf("%d%d%d",&nrow,&ncol,&num);

pA->m = nrow;

pA->n = ncol;

pA->len = num;

for(i = 1; i <= num; i++)

{

printf("请输入第 %d 个元素的行号、列号和元素值:",i);

scanf("%d%d%d",&nrow,&ncol,&elem);

pA->data[i].row = nrow;

pA->data[i].col = ncol;

pA->data[i].e = elem;

}

}

void Print(TSMatrix *pA)

{

int i,j,t;

for(i = 1,t =1; i <= pA->m; i++)

{

for(j = 1; j <= pA->n; j++)

{

if(pA->data[t].row == i && pA->data[t].col ==j)

{

printf("%4d",pA->data[t].e);

t++;

}

else

printf("%4d",0);

}

printf("\n");

}

}

void Add(TSMatrix *pA,TSMatrix *pB,TSMatrix *pC)

{

int i,j,t;

if(pA->m != pB->m || pA->n != pB->n)

{

printf("两个矩阵的行数与列数不相等,不能相加!\n");

return;

}

pC->m = pA->m;

pC->n = pA->n;

i = 1;

j = 1;

t = 0;

while(i <= pA->len && j <= pB->len)

{

if(((pA->data[i].row - 1)*pA->n + pA->data[i].col -1) <

((pB->data[j].row - 1)*pB->n + pB->data[j].col -1) )

{

t++;

pC->data[t].row = pA->data[i].row;

pC->data[t].col = pA->data[i].col;

pC->data[t].e = pA->data[i].e;

i++;

}

else

if(((pA->data[i].row - 1)*pA->n + pA->data[i].col -1) >

((pB->data[j].row - 1)*pB->n + pB->data[j].col -1) )

{

t++;

pC->data[t].row = pB->data[j].row;

pC->data[t].col = pB->data[j].col;

pC->data[t].e = pB->data[j].e;

j++;

}

else

if(pA->data[i].e + pB->data[j].e != 0)

{

t++;

pC->data[t].row = pA->data[i].row;

pC->data[t].col = pA->data[i].col;

pC->data[t].e = pA->data[i].e + pB->data[j].e;

i++;

j++;

}

}

while(i <= pA->len)

{

t++;

pC->data[t].row = pA->data[i].row;

pC->data[t].col = pA->data[i].col;

pC->data[t].e = pA->data[i].e;

i++;

}

while(j <= pB->len)

{

t++;

pC->data[t].row = pB->data[j].row;

pC->data[t].col = pB->data[j].col;

pC->data[t].e = pB->data[j].e;

j++;

}

pC->len = t;

}

void main()

{

TSMatrix A,B,C;

Input(&A);

Print(&A);

Input(&B);

Print(&B);

Add(&A,&B,&C);

Print(&C);

}

5.5 //p112习题5.5 写一个在十字链表中删除非零元素a(i,j)的算法

#include

#include

typedef int ElementType;

typedef struct OLNode

{

int row,col;

ElementType value;

struct OLNode *right,*down;

}OLNode,*OLink;

typedef struct

{

OLink *row_head,*col_head;

int m,n,len;

}CrossList;

void CreateCrossList(CrossList *M)

{

int m,n,t,i,j,e;

OLink p,q;

printf("请输入矩阵的行数、列数和非0元素个数:");

scanf("%d%d%d",&m,&n,&t);

if(m < 1 || n < 1 || t < 0)

return;

M->m = m; M->n = n; M->len = t;

M->row_head = (OLink *)malloc(sizeof(OLink) * (m + 1));

M->col_head = (OLink *)malloc(sizeof(OLink) * (n + 1));

for( i = 1; i <= m; i++)

M->row_head[i] = 0;

for( i = 1; i <= n; i++)

M->col_head[i] = 0;

for( m =1; m <= t; m++)

{

printf("请输入第 %d 个非0元素的行号、列号和元素值:",m);

scanf("%d%d%d",&i,&j,&e);

p = (OLink)malloc(sizeof(OLNode));

p->row = i; p->col = j; p->value = e;

if(M->row_head[i] == 0)

{

M->row_head[i] = p;

p->right = 0;

}

else

{

q = M->row_head[i];

while( q->right != 0 && q->right->col < j)

q = q->right;

p->right = q->right;

q->right = p;

}

if(M->col_head[j] == 0)

{

M->col_head[j] = p;

p->down = 0;

}

else

{

q = M->col_head[j];

while( q->down != 0 && q->down->row < i )

q = q->down;

p->down = q->down;

q->down = p;

}

}

}

int DeleElem(CrossList *M,int i,int j)

{

OLink p,q;

p = M->row_head[i];

if(p == 0)

return (0);

while(p != 0 && p->col != j)

{

q = p;

p = p->right;

}

if(p == 0)

return(0);

if(p == M->row_head[i])

M->row_head[i] = p->right;

else

q->right = p->right;

q = M->col_head[j];

if(q == p)

M->col_head[j] = p->down;

else

{

while(q->down != p)

q = q->down;

q->down = p->down;

}

free(p);

return(1);

}

void Print(CrossList *M)

{

int i,j;

OLink p;

for(i = 1; i <= M->m; i++)

{

p = M->row_head[i];

for(j = 1; j<= M->n; j++)

if(p != 0 && p->col == j)

{

printf("%4d",p->value);

p = p->right;

}

else

printf("%4d",0);

printf("\n");

}

}

void main()

{

int i,j;

CrossList M;

CreateCrossList(&M);

Print(&M);

printf("请输入要删除的元素的行号和列号");

scanf("%d%d",&i,&j);

if(DeleElem(&M,i,j))

printf("成功删除!\n");

else

printf("没有对应元素!\n");

Print(&M);

}

5.6

5.7 (a,b),((c,d)),(b),b,(d)

实习题:

#include

#include

#include

void CreateArray(int *a,int m,int n)

{

time_t t;

int i;

time(&t);

srand((unsigned int)t);

for(i = 0; i

a[i] = rand() % 100;

}

int SearchSaddlePoint(int *a,int m,int n)

{

int i,j,k,pmin,pmax;

for(i=0; i

{

pmin = i*n;

for(j = 1; j

if(*(a+i*n+j) < *(a+pmin))

pmin = i*n + j;

pmax = pmin;

k = pmax % n;//得到第i行中最小元素所在的列号

for(j = k; j < m*n; j+=n)

if(*(a+j) > *(a+pmax))

pmax = j;

if(pmax == pmin)

{

printf("%d\t%d\n",pmax/n + 1,pmax%n + 1);

return 1;

}

}

return 0;

}

void PrintArray(int *a,int m,int n)

{

int i,j;

for(i = 0; i < m; i++)

{

for(j = 0; j < n; j++)

printf("%5d",*(a+i*n+j));

printf("\n");

}

}

void main()

{

int *a;

int m,n;

printf("请输入要创建的矩阵的行数和列数:");

scanf("%d%d",&m,&n);

a = (int *)malloc(sizeof(int)*m*n);

while(1)

{

CreateArray(a,m,n);

//PrintArray(a,m,n);

if(SearchSaddlePoint(a,m,n))

{

PrintArray(a,m,n);

break;

}

//printf("\n");

}

free(a);

}

补充练习:

1、对于一个二维数组A[m][n],若按行序为主序存储,则任一元素A[i][j]相对于A[0][0]的地址是多少?

2、一个稀疏矩阵为,则对应的三元组表是什么?

3、设有一个10阶的对称矩阵A,采用压缩存储方式以行序为主序存储,a00为第一个元素,其存储地址为0,每个元素占有一个存储地址空间,则a85的地址是多少?

4、设有上三角矩阵(aij)n×n,将其上三角逐行存于数组B[m]中,使得B[m]= aij,且k=f1(i)+f2(j)+c。请写出函数f1,f2和常数c(f1和f2中不含常数项)。

5、求下列广义表操作的结果:

(1)Head((p,h,w));

(2)Tail((b,k,p,h));

(3)Tail(((a,b),(c,d)));

(4)Tail(Head(((a,b),(c,d))));

(5)Tail(Head(Tail(((a,b),(c,d)))));

6、假设稀疏矩阵A和B均以三元组顺序表作为存储结构,试写出矩阵相加的算法:

int AddMatrix(TSMatrix A,TSMatrix B,TSMatrix &C);

7、试编写一个以三元组形式输出用十字链表存储表示的稀疏矩阵中非零元素的下标及其元素值的算法:int Print(CrossList &M);

8、按照教材5.5节中图5.8所示结点结构,画出下列广义表的存储结构图,并求出它的深度。

(1)((()),a,((b,c),(),d),(((e))))

(2)((((a),b)),(((),d),(e,f)))

9、设三角矩阵R=采用一维数组进行压缩存储,第一个元素为R11,存储位置为1,每个元素占一个存储位置,则R32的存储位置为几?

参考解答:

1、&A[0][0]+(i*n+j)*L //L为每一数据元素所占的字节数

2、((1,3,2),(2,1,3),(3,3,-1),(3,4,5))

3、&aij=&a00+(i*(i+1)/2+j)*L (i>=j) //&a00为第一个元素的地址,L为每一

&aij=&a00+(j*(j+1)/2+i)*L (j>=i) //元素所占存储空间则a85的地址为0+8*9/2+5=41

4、若行号与列号均从0开始,则元素aij前有i行,各行的非0元素个数从n到n-i+1,共有i*(n+n-i+1)/2个元素,aij所在的行中,其前面共有j个元素,但为0的元素有i个,不为0的元素个数则为j-i个,所以在上三角中aij前面共有i*(n+n-i+1)/2+ j-i个非0的元素,这些元素需要存储在一维数组B[]中,且在aij的前面,若一维数组的下标也从0开始,若用B[k]存储aij,则k= i*(n+n-i+1)/2+ j- i =(-i2-i+2in)/2+j

即: c=0

若下标均从1开始,则 c=-n

5、(1) p (2)(k,p,h) (3)((c,d)) (4)(b) (5)(d)

6、参考上面教材习题解答。

7、Status Print(CrossList &M)

{ OLink *p;

p=M.rhead;

for(i=1;i<=M.mu;i++)

{ q=p[i];

while(q){ //将第i行链各结点输出

printf(“(%d,%d,%d),,q->i,q->j,q->e); //输出一个结点所对应的三元组

q=q->right;

}

}

}

8、深度均为4,画图略。

9、&Rij=&R11+(i*(i-1)/2+j-1)*L=1+4=5

图十字链表并求度c语言,第5章_西安电子科技大学出版社:算法与数据结构-C语言描述(樊希平)_doc_大学课件预览_高等教育资讯网...相关推荐

  1. 计算圆环面积的c语言程序,C0610求圆环面积_C语言程序设计源代码_doc_大学课件预览_高等教育资讯网...

    #include void main() { double r2,r1,s; double area_ring (double x,double y); /*函数原型,求圆环面积*/ printf(& ...

  2. 输入三门成绩求平均成绩的C语言代码,C0417求平均成绩_C语言程序设计源代码_doc_大学课件预览_高等教育资讯网...

    #include"stdio.h" void main() { int x,y,z,sum,ave,corr,need; printf("请输入学生的三门功课的考试成绩: ...

  3. lisp语言画键槽_用LISP语言自定义AutoCAD命令_AutoCAD实用参考资料_doc_大学课件预览_高等教育资讯网...

    用LISP语言自定义AutoCAD命令AutoLISP语言作为AutoCAD的二次开发工具,虽然在功能.运行速度和保密性等方面比起ARX等工具要逊色一些,但由于它易学易用,交互性好,灵活性强,对于那些 ...

  4. 三元函数的几何图形一般是_多元函数微分学_高等数学习题与答案_doc_大学课件预览_高等教育资讯网...

    第十章 多元函数微分学 多元函数的极限及连续性 思考题: 1,将二元函数与一元函数的极限.连续概念相比较,说明二者之间的区别. 答:二元函数与一元函数的极限都是表示某动点以任意方式无限靠近定点时,与之 ...

  5. matlab编一个福利彩票电脑选号的程序,第14讲 计算机模拟_云南师范大学:数学建模与数学实验(费培之)_ppt_大学课件预览_高等教育资讯网...

    计算机模拟实验目的实验内容学习计算机模拟的基本过程与方法. 1.模拟的概念. 4.实验作业 . 3.计算机模拟实例. 2.产生随机数的计算机命令. 连续系统模拟实例,追逐问题离散系统模拟实例,排队问题 ...

  6. matlab数学实验课件4,数学实验4_数学实验_doc_大学课件预览_高等教育资讯网

    实验4 插值拟合与最优化实验目的: 1.了解插值和拟合的基本思想: 2.掌握用matlab软件插值和拟合的命令: 3.掌握用matlab软件求解线性规划.二次规划的命令. 实验内容: 一维多项式插值 ...

  7. matlab的讲稿ppt,Matlab初步(讲稿200508)之一_Matlab讲解_doc_大学课件预览_高等教育资讯网...

    Matlab初步(讲稿) 上课方式:学生边听讲.边用机器练习. 调用Matlab软件:在windows平台上,双击"Matlab"图标. 说明:执行此命令,将进入"Mat ...

  8. 大学物理实验试卷1到8_15_试卷(光学,大学物理实验)_doc_大学课件预览_高等教育资讯网...

    大 学 物 理 实 验 试 题注意:所有答案都必须写在答题卡上,否则答题无效. 一.填空题:(在下面10题中任选8题,不选的题号上打×) 1.惠斯顿电桥桥路中保护电阻开关用以保护,只有细调时此开关才 ...

  9. 管理运筹学软件计算机解咋看,第3章 线性规划问题的计算机求解_中国地质大学(武汉):管理运筹学(郭海湘)_ppt_大学课件预览_高等教育资讯网...

    管 理 运 筹 学 1 第三章 线性规划问题的计算机求解 § 1,管理运筹学"软件的操作方法 § 2,管理运筹学"软件的输出信息分析管 理 运 筹 学 2 第三章 线性规划问题的计 ...

最新文章

  1. cmake, This may result in binaries being created in the wrong place
  2. 图灵2010.01书讯——看你错过了哪一本
  3. Echarts的坐标调整,调整内部网格和外部的间隔
  4. 【代码笔记】Web-JavaScript-JavaScript调试
  5. c++ set有序性
  6. Log4j的FileAppender配置
  7. 1027. 打印沙漏(20)
  8. 如何启用 SAP Business Technology Platform 上的 Mobile Services
  9. rabbitmq的安装全过程
  10. Diango博客--6.Markdown 文章自动生成目录
  11. mvn 修改所有子项目pom版本
  12. 使用VS 2019,.NET Core 3和Web API创建ASP.NET Core Blazor CRUD应用程序
  13. on_mouse OpenCV 获得矩形区域
  14. JSP购物车案例精简版-适合小白学习
  15. 如何安全的使用密码登录账号(在不知道密码的情况下)
  16. 百度收购YY:第三次直播大战开启
  17. c语言音乐程序天空之城,51单片机演奏天空之城 c语言源程序
  18. 自定义绘制三阶B样条曲线
  19. ZipOutputStream导出压缩文件
  20. VUE实现简易todos

热门文章

  1. Python 获取文件夹中的文件列表
  2. 网络抓包技术: scapy
  3. COMSOL Multiphysics学习
  4. #2020寒假集训#树形基础入门(Tree)代码笔记
  5. 安装HeidiSQL
  6. pycharm安装nodejs插件运行js代码
  7. 关于低噪声放大器的测试过程
  8. 不要轻易放弃丢失的U盘文件夹数据,这里有按文件夹恢复数据的技巧
  9. MATLAB文本注释及特殊符号的表示
  10. DBeaver连接mysql超时