严蔚敏数据结构习题第五章

https://www.jianshu.com/p/d7d5545012e2
习题答案:https://www.cnblogs.com/kangjianwei101/p/5229548.html

1 && 2

在这里插入图片描述
在这里插入图片描述
//注意行列存储
在这里插入图片描述
在这里插入图片描述

10

广义表最基本的操作:取表头head(LS)与取表尾tail(LS)
https://blog.csdn.net/qq_38842021/article/details/82290201

head() 返回列表的第一个元素;
tail() 返回列表的删去第一个元素之后的剩余列表;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11

在这里插入图片描述

12

在这里插入图片描述

13

在这里插入图片描述

19

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//这个没有办法找到所有的,只能找到一行中前面的
#include <stdio.h>
#include <stdlib.h>
#define m 5
#define n 4
typedef struct Node
{
	int row;//行
	int col;//列
	int data;
};

void SaddlePoint(int a[m][n])
{
	Node s[20];
	int max, min, i, j, k=0;
	int q = 0;
	for (i = 0; i < m; i++)
	{
		min = a[i][0];
		for (j = 0; j < n; j++)//找行最小值
		{
			if (min > a[i][j])
			{
				min = a[i][j];
				k = j;//k是最小值的列数
			}
		}
		max = a[i][k];
		for (j = 0; j < n; j++)//找k列的最大值
		{
			if (max < a[j][k])
			{
				max = a[j][k];
			}
		}
		if (max == min)//找到的最值比较,相同表明是马鞍点
		{
			s[q].col = i;
			s[q].row = k;
			s[q].data = a[i][k];
			printf("鞍点行数为 %d 列数为%d 值为 %d \n", s[q].row + 1, s[q].col + 1, s[q].data);
		}
	}
}

int main()
{
	int a[m][n] = {
		{3,6,4,9},
		{1,2,3,4},
		{9,9,9,9},
		{1,1,1,1},
		{2,3,1,1},
	};
	SaddlePoint(a);
	return 0;
}

21

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10

//三元组稀疏矩阵类型定义
typedef int ElemType;
typedef struct
{
	int i, j;//该非零元的行列下标
	ElemType e;
}Triple;
typedef struct
{
	Triple data[MAXSIZE + 1];//data[0]是不用的
	int mu, nu, tu;//矩阵的行列,非零元个数
}TSMatrix;

int AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q)
{
	int m, n, q;
	if (M.mu != N.mu || M.nu != N.nu)//判断两矩阵的行列是否相同
	{
		printf("两个矩阵不能相加\n");
		return 0;
	}
	Q->mu = M.mu;//给Q赋值
	Q->nu = M.nu;
	Q->tu = 0;
	m = n = q = 1;
	while (m <= M.tu && n <= N.tu)//遍历对比,行列相同的相加
	{
		if (M.data[m].i < N.data[n].i)
		{
			Q->data[q] = M.data[m];
			m++;
		}
		else if (M.data[m].i > N.data[n].i)
		{
			Q->data[q] = N.data[n];
			n++;
		}
		else //M的行与N的行相同
		{
			if (M.data[m].j < N.data[n].j)
			{
				Q->data[q] = M.data[m];
				m++;
			}
			else if (M.data[m].j > N.data[n].j)
			{
				Q->data[q] = N.data[n];
				n++;
			}
			else//M的列=N的列
			{
				if (M.data[m].e + N.data[n].e)
				{
					Q->data[q].i = M.data[m].i;
					Q->data[q].j = M.data[m].j;
					Q->data[q].e = M.data[m].e + N.data[n].e;
					m++;
					n++;
				}
				else
				{
					m++;
					n++;
				}
			}
		}
		q++;
		Q->tu++;
	}
	while (m <= M.tu)
	{
		Q->data[q] = M.data[m];
		m++;
		q++;
		Q->tu++;
	}
	while (n <= N.tu)
	{
		Q->data[q] = N.data[n];
		n++;
		q++;
		Q->tu++;
	}
	return 0;
}

30

在这里插入图片描述

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
//广义表的头尾链表存储表示 p109
typedef enum {ATOM,LIST}ElemTag;//ATOM==0:原子,LIST==1:子表
typedef struct GLNode
{
	ElemTag tag; //区分原子节点和表节点
	union
	{
		int atom; //值域
		struct 
		{
			struct GLNode* hp, * tp; //ptr是表节点的指针域,ptr.hp和ptr.tp分别指向表头表尾
		}ptr;
	};
}*GList;

int GListDepth(GList& L)
{
	int depth = 0;
	int hpdepth, tpdepth;//表头表尾深度
	if (!L) return 1;//空表深度为1
	if (L->tag = ATOM) return 0;//原子深度为0
	hpdepth = GListDepth(L->ptr.hp) + 1;
	tpdepth = GListDepth(L->ptr.tp);
	return hpdepth > tpdepth ? hpdepth : tpdepth;
}

分割线

typedef enum {ATOM,LIST} ElemTag;
typedef struct GLNode{
     ElemTag tag;
     union {
       char atom;
       struct { 
         GLNode *hp, *tp;
       } ptr;
     }un;
} *GList;
int GListDepth(GList ls)
{
    GList pp;
    int max, h, t;
    if(!ls)
       return 1;
    if(ls->tag == ATOM)
       return 0;
    for(pp=ls; pp; pp=pp->un.ptr.tp){
       h = GListDepth(pp->un.ptr.hp)+1;
       t = GListDepth(pp->un.ptr.tp);
       if(h > t)
           return h;
       else
           return t;
    }          
}

32

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
//广义表的头尾链表存储表示 p109
typedef enum { ATOM, LIST }ElemTag;//ATOM==0:原子,LIST==1:子表
typedef struct GLNode
{
	ElemTag tag; //区分原子节点和表节点
	union
	{
		int atom; //值域
		struct
		{
			struct GLNode* hp, * tp; //ptr是表节点的指针域,ptr.hp和ptr.tp分别指向表头表尾
		}ptr;
	};
}*GList;

int GListCompare(GList& L1, GList& L2)
{
	if (!L1 && !L2) //表1,2都为空,表示他们相同
		return 1;
	if (L1 && L2)//两个表都不为空
	{
		if (L1->tag == L2->tag)
		{
			if (L1->tag == ATOM)//如果是原子节点
			{
				if (L1->atom == L2->atom)
					return 1;
			}
			else
			{
				if (GListCompare(L1->ptr.hp, L2->ptr.hp))
					if (GListCompare(L1->ptr.tp, L2->ptr.tp))
						return 1;
			}
		}
	}
	return 0;
}

33

#include <stdio.h>
#include <stdlib.h>
//广义表的头尾链表存储表示 p109
typedef enum { ATOM, LIST }ElemTag;//ATOM==0:原子,LIST==1:子表
typedef struct GLNode
{
	ElemTag tag; //区分原子节点和表节点
	union
	{
		int atom; //值域
		struct
		{
			struct GLNode* hp, * tp; //ptr是表节点的指针域,ptr.hp和ptr.tp分别指向表头表尾
		}ptr;
	};
}*GList;

void Get(GList L, int a)//a的初赋值为0
{
	int i = a;
	if (L)
	{
		if (L->tag == ATOM)
			printf("%c -> 第%d层\n", L->atom, i);
	}
	if (L->tag == LIST)
	{
		Get(L->ptr.hp, i + 1);
		Get(L->ptr.tp, i );
	}
}

38

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
//广义表的头尾链表存储表示 p109
typedef enum { ATOM, LIST }ElemTag;//ATOM==0:原子,LIST==1:子表
typedef struct GLNode
{
	ElemTag tag; //区分原子节点和表节点
	union
	{
		int atom; //值域
		struct
		{
			struct GLNode* hp, * tp; //ptr是表节点的指针域,ptr.hp和ptr.tp分别指向表头表尾
		}ptr;
	};
}*GList;

void Get_L_ATOM(GList L, int l, int a)//a的初值赋值是0
{
	int i = a;
	if (L && l >= i)
	{
		if (L->atom == ATOM)
		{
			if (l == i)
				printf("%c", L->atom);
		}
		else
		{
			Get_L_ATOM(L->ptr.hp, l, i + 1);
			Get_L_ATOM(L->ptr.hp, l, i);
		}
	}
}
1.两个串相等的充要条件是( )。A.串长度相等B.串长度任意 C.串中各位置字符任意 D.串中各位置字符均对应相等 2.对称矩阵的压缩存储:以行序为主序存储下三角中的元素,包括对角线上的元素。二维下标为( i, j ),存储空间的一维下标为k,给出k与 i, j (i<j)的关系k=( ) (1<= i, j <= n , 0<= k < n*(n+1)/2)。 A.i*(i-1)/2+j-1 B.i*(i+1)/2+j C.j*(j-1)/2+i-1 D.j*(j+1)/2+i 3.二维数组A[7][8]以列序为主序的存储,计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A.38 B.43 C.26 D.29 4.已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。A.108 B.180 C.176 D.112 5. 下面( )不属于特殊矩阵。 A.对角矩阵 B. 三角矩阵C. 稀疏矩阵 D. 对称矩阵 6. 假设二维数组M[1..3, 1..3]无论采用行优先还是列优先存储,其基地址相同,那么在两种存储方式下有相同地址的元素有( )个。 A. 3 B. 2 C. 1 D. 0 7. 若Tail(L)非空,Tail(Tail(L))为空,则非空广义表L的长度是( )。(其中Tail表示取非空广义表的表尾) A. 3 B. 2 C. 1 D. 0 8.串的长度是( )。 A.串中不同字母的个数 B.串中不同字符的个数C.串中所含字符的个数,且大于0 D.串中所含字符的个数 9.已知广义表(( ),(a), (b, c, (d), ((d, f)))),则以下说法正确的是( )。A.表长为3,表头为空表,表尾为((a), (b, c, (d), ((d, f))))B.表长为3,表头为空表,表尾为(b, c, (d), ((d, f)))C.表长为4,表头为空表,表尾为((d, f)) D.表长为3,表头为(()),表尾为((a), (b, c, (d), ((d, f))))10.广义表A=(a,b,c,(d,(e,f))),则Head(Tail(Tail(Tail(A))))的值为( )。(Head与Tail分别是取表头和表尾的函数) A.(d,(e,f)) B.d C.f D.(e,f)二、填空题(每空 2 分,共 8 分)。 1.一个广义表为 F = (a, (a, b), d, e, (i, j), k),则该广义表的长度为________________。GetHead(GetTail(F))= _______________。 2.一个n*n的对称矩阵,如果以行或列为主序压缩存放入内存,则需要 个存储单元。 3.有稀疏矩阵如下: 0 0 5 7 0 0 -3 0 0 0 4 0 0 2 0 它的三元组存储形式为: 。 三、综合题(共 22 分)。 1.(共8分)稀疏矩阵如下图所示,描述其三元组的存储表示,以及转置后的三元组表示。 0 -3 0 0 0 4 0 6 0 0 0 0 0 0 7 0 15 0 8 0 转置前(4分): 转置后(4分): 2. (共14分)稀疏矩阵M的三元组表如下,请填写M的转置矩阵T的三元组表,并按要求完成算法。 (1)写出M矩阵转置后的三元组存储(6分): M的三元组表: T的三元组表: i j e 2 1 3 3 2 4 4 2 5 4 3 5 5 1 6 5 3 6 i j e (2)如下提供了矩阵采用三元组存储时查找指定行号(m)和列号(n)元素值的算法框架,将代码补充完整(每空2分,共8分)。 typedefstruct{ inti,j; ElemType e; }Triple; typedefstruct{ Triple data[MAXSIZE+1]; //data[0]未用 intmu,nu,tu; //矩阵的行数,列数和非零元的个数 }TSMatrix; voidFind_TSMatrix(TSMatrix M, int m, int n, ElemType&e) //M为要查找的稀疏矩阵三元组存储,m为要查找的元素的行号,n为列号,e为查找后得到的值。 { for ( i=1 ; i<=M.tu ;i++) if( && ) { e=M.data[i].e; ; } if( ) e=0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值