其他分享
首页 > 其他分享> > 严蔚敏数据结构习题第五章

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

作者:互联网

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);
		}
	}
}

标签:struct,int,++,严蔚敏,ATOM,习题,数据结构,data,ptr
来源: https://blog.csdn.net/han29_/article/details/115439652