关于数据结构的问题,望解答,谢谢! 一个关于数据结构的问题,有关哈夫曼编码的,解答看不懂,求解答...

www.zhiqu.org     时间: 2024-06-01
答案为C、4
共有9个数
第一次:(1+9)/2=5 第5个数为37,26小于37,所以往左边找
第二次:(1+4)/2=2.5 取4,第2个数为12,26大于12,所以往12的右边找
第三次:(3+4)/2=3.5 取3,为20
第四次:(4+4)/2=4 为26
所以为4 顺序为37 12 20 26

//注意:以//%%开头的为本次修改的内容
//现在只是修改了编译错误。如果有问题,再帮你看看。

#include<stdio.h>
#include <stdlib.h> //%%加上头文件,解决malloc等问题
#define STACK_INIT_SIZE 100 /*标识符定义不能使用减号*/
#define STACKINCREMENT 10
#define ERROR -1 /*添加ERROR定义*/
#define OVERFLOW -2 /*添加OVERFLOW定义*/
#define ok 1 /*添加ok定义*/
#define true 1 /*添加true定义,下文中ture全改为true*/
#define false 0 /*添加false定义*/

typedef struct
{
int ord;
int p;
int q;
}SELETYPE;
SELETYPE e;
typedef struct
{
SELETYPE*base;
SELETYPE*top;
int stacksize;
}sqstack;
int a[10][10]; /*你在print()函数中使用了a[][],必须定义为全局变量*/

int Initstack(sqstack*s)
{
s->base=(SELETYPE*)malloc(STACK_INIT_SIZE*sizeof(SELETYPE));
if(!s->base)
exit(OVERFLOW);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE; /*修改,全改为STACK_INIT_SIZE*/
return ok;
}

int push(sqstack*s,SELETYPE f)
{
if(s->top-s->base>=s->stacksize)
{s->base=(SELETYPE*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(SELETYPE));
if(!s->base)
exit(OVERFLOW);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=f;
return ok;
}

int pop(sqstack*s,SELETYPE f)
{
if(s->top==s->base)
return ERROR;
f=*--s->top; /* s.top 改为s->top */
return ok;
}

int stackempty(sqstack*s)
{
if(s->top==s->base)
return true;
else
return false;
}

void print()
{
int i,j;
for(i=0;i<10;i++)
{
printf("\n"); //%%printf()函数第一个参数必须为字符串
for(j=0;j<10;j++)
printf("%3d",a[i][j]);
}
}
int main()
{
int i,j,r1,r2,c1,c2,curstep=1;
sqstack*p;
printf("please input the enter:");
scanf("%d%d",&r1,&c1);
printf("please input the exit:");
scanf("%d%d",&r2,&c2);
for(i=0;i<10;i++)
{
printf("\n"); //%%printf()函数第一个参数必须为字符串
for(j=0;j<10;j++)
scanf("%d",&a[i][j]); /* 输入 a[i][j] 改为 &(a[i][j])*/
}
do
{
if(a[r1][c1]==1)
{
a[r1][c1]=curstep;
e.ord=curstep;
e.p=r1;
e.q=c1;
push(p,e);
if(r1==r2&&c1==c2)
return true;
c1++;
curstep++;
}
else
{
if(!stackempty(p)) //%%stackempty是函数,不是变量(要参数)
{
pop(p,e);
while(e.ord==4&&!stackempty(p)) /* dr 改为 e.ord, s 改为 p */
{
a[r1][c1]=-1;
pop(p,e);
}
if(e.ord<4) /* e.rd 改为 e.ord */
{
e.ord++; /* e.rd 改为 e.ord */
push(p,e);
switch(e.ord) /* e.rd 改为 e.ord */
{ /* switch 后加上花括号 */
case 2:
r1--;
break; /* case 后要加上 break; */
case 3:
c1--;
break; /* case 后要加上 break; */
case 4:
r1++;
break; /* case 后要加上 break; */
} /* switch 后加上花括号 */
}
}
}
}while(!stackempty(p)); /* s 改为 p */
print();
}


C
37 10 20 26

一个数据结构的疑问,望解答,谢谢!~

线性是一种逻辑结构,数据结构中的除去首尾元素外,其他元素都有唯一的前驱和后继
多维数组元素之间的逻辑关系(前驱后继关系)通过数组下标体现出来的。
而矩阵通常认为元素之间没有特定的前后关系。
其实这些都是人为定义的,约定俗成的习惯,如果你对矩阵里面的元素设定一种特定的线性逻辑关系,也可以认为这个特定矩阵是线性结构

根据题意哈夫曼树的形状类似如下
o
/ \
o Y
/ \
o Y
/ \
o o
/ \ / \
A B C D
或者
o
/ \
o Y
/ \
o Y
/ \
o C
/ \
A B
第1点,编码长度不超过4,每一个“/”边表示为0 ,“\”边表示为1,如上图A的编码是:0000,B是0001,如果深度超过5,有六层的话,最下面的叶子结点编码有5位,所以编码长度不超过4,说明哈夫曼树深度不超过5
第2点,编码1 和 01 是在深度为2、3层,如上面的图Y。
第3点,其他字符有可能是00或者 0000 0001 0010 0011或者 001 0000 0001 在第三层 第四层 第五层,这里说只能在第四层和第五层,不严谨。有可能只有是三个字符的时候,只有三层了。
还可以多少个字符编码:1个或者3个或者4个。


#柯固胁# 数据结构问题,求解答,谢谢! -
(17717388539): 答案 : 472 行优先存储明白吗?就是一行一行的存,不是一列一列的存.题目告诉了A[1][1]和A[3][3]的存储地址,是想让你推算出A数组的大小.由于A[1][1]的地址是420,所以A[1][0]的地址就是419,还有A[3][3]的地址是446,那么A[3][0]的地址就是443.从A[1][0]到A[3][0],恰好实用了2行,(443-419)/ 2 = 12,也就是说数组A的大小是A[12][N],N没必要算出来,也算不出来.这样就知道了A[5][0]的地址是 419 + 12 * 4 = 467,那么A[5][5]就是467+5 = 472 了.

#柯固胁# 数据结构题目,求大神解答 -
(17717388539): 对于头的部分,删除操作是将头指针指向第二个结点即可;插入操作为将头指针指向新结点,新结点指向新插入的结点即可 对于尾的部分,因为有尾指针,相当于我们能获取到尾结点,指向新结点即可完成插入操作;但是由于是单链表,尾结点中不存在指向前驱的指针,而删除操作需要把倒数第二个结点的next指针置null,所以只能从头开始遍历,故此选项与长度有关!

#柯固胁# 数据结构题目求解答!先谢各位了!! -
(17717388539): 第一题选D:顺序存储结构 首先说明一下什么是数据的存储结构,它是批数据结构在计算机中的表示(物理结构),主要有四种:顺序存储、链式存储、索引存储和散列存储.顺序存储的特点是:逻辑上相邻的元素存储在物理位置上也相邻的存...

#柯固胁# 数据结构的问题 -
(17717388539): 这个题目的意思应该是合并两个有序链表La和Lb到链表Lc,而语句pc->next = pa; pc = pa; pa = pa->next; 是将La中pa所指的结点链接到Lc的后面,语句pc->next = pa;表示链接进来,pa成为当前Lc的最后一个结点,但注意,pc任然是指向原来Lc的最后一个结点,即pa前面的结点,并不是指向当前Lc的最后一个结点pa,所以要执行pc=pa;后,pc才指向当前Lc的最后一个结点pa.

#柯固胁# 数据结构问题求解
(17717388539): 公式 1/(n+1)Cn,2n; 10*9*8*7*6/5/4/3/2/1/6=42;

#柯固胁# 求关于数据结构的一些问题答案 -
(17717388539): Status DeleteK(SqList&a, int i, int k){ //本过程从顺序存储结构的线性表a中删除第i个元素起的k个元素 if ( i<1 || k<0 || i+k> a.length ) return INFEASIBLE; //参数不合法 else{ ///循环嵌套,费时费力,时间复杂度很高,改为一个循环即可. /*for(count ...

#柯固胁# 麻烦帮忙解答一下数据结构的题目,谢谢 -
(17717388539): 先说明下呀~ 你这句话: 后序:FIBCMADEH 应该是中序哟!从先序看A开头说明A是根节点, 从中序看A左边的都是根节点的左子树,即FIBCM 看A右边的都是根节点的右子树,即DEH.由于树具有递归的性质,再看先序,B是根节点的左字数的根节点,也可以看成根节点. 根据上面的特点,就可以层层推出二叉树的结构了.最后得到二叉树的结构,用数组存放得 A B D I C ^ E F ^ ^ M ^ ^ ^ H

#柯固胁# 数据结构问题,请大神帮我解答一下,谢谢 -
(17717388539): 是一个递归算法首先根节点输出然后调用自身{把左子树的根节点输出} 调用自身{再把右子树的根节点输出} / \ / \ 调用自身(左) 调用自身(右) 调用自身(左) 调用自身(右) /\ /\ …这样递归调用一直到叶节点就停止这样就能遍历整个树~~这是先根遍历

#柯固胁# 请一个数据结构问题的解答谢谢 -
(17717388539): 书本有例子,我也很久没看过数据结构了深度优先:其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.不唯一ABDEGHFC,ACDBEGFH....等等广度优先:广度优先遍历是以层为顺序,将某一层上的所有节点都搜索到了之后才向下一层搜索ABCDEFGH,http://baike.baidu.com/view/288277.htmlhttp://baike.baidu.com/view/1242613.html

#柯固胁# 数据结构问题,求解,谢谢 -
(17717388539): s = p; // 先用临时变量s记录while (s->next->next != p) // 查找p的直接前趋结点的前趋结点 s = s->next; // 不是p的直接前趋,则挪动s指针继续向后找// 当找到p的直接前趋结点的前趋结点后,退出循环,且s指向该前趋结点//删除结点q = s->next; // 暂存该前趋结点的下一结点,也就是p的直接前趋结点s->next = q->next; // 将p赋给p的前趋结点的前趋结点的next,这样p的前趋结点就被删掉了.// 注: 其实这里直接 s->next = p; 就行了free(s); // 清除p的前趋结点所占用的空间