KKK735 2021-11-27 01:20 采纳率: 75%
浏览 34
已结题

创建动态数组后,另一个数组的最后一个元素值被改变

在用c语言编写哈夫曼树时,为了存放权值,建立了一个有8个元素的结构体数组S,而后依次将8个结构体的权值成员赋值为1,2,3,4,5,6,7,8

s  S[7];
    printf("请输入8个字符的权值:\n");
    for(int i=1;i<=7;i++){
        scanf("%u",&S[i].weight);
        printf("%d\n",S[i].weight);
    }

img

然后创建一个动态数组HT,此时发现S最后一个结构体元素的权值成员变为了随机值,这是为什么?

    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
    printf("%u\n",S[7].weight);
    for(unsigned int g=0;g<=7;g++){
         printf("%u\t",S[g].weight);
    }

img

完整代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 8
//存储哈夫曼树的静态三叉链表定义
typedef struct{
unsigned int weight;
unsigned int parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char ** HuffmanCode;
//字符、权值、对应编码组成的结构体类型
struct s 
{
char c;
unsigned int weight;
char code[N];
};
//选择两个权值最小的结点
void Select(HuffmanTree &HT,unsigned int i,int *s1,int *s2){
    unsigned int min1,min2,j;
    min1=min2=9999;
    for(j=1;j<=i;j++){
        if(HT[j].parent==0){
            if(HT[j].weight<min2){
                if(HT[j].weight<min1){
                    min2=min1;
                    min1=HT[j].weight ;
                    *s1=j;
                }
                else {
                    min2=HT[j].weight ;
                    *s2=j;
                }
            }
        }
    }
}

//构造哈夫曼树和哈夫曼编码
void Huffman(HuffmanTree &HT,HuffmanCode &HC,unsigned int n,s S[N]){
    if (n<=1)return;
    unsigned int i=0,m=2*n-1,c=0,f=0;
    int s1=0,s2=0;
    HuffmanTree p;
    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
    printf("%u\n",S[7].weight);
    for(unsigned int g=0;g<=7;g++){
         printf("%u\t",S[g].weight);
    }
    printf("\n");
    for(p=HT+1,i=1;i<=n;i++,++p){
        p->parent=0;
        p->lchild=0;
        p->rchild=0;
        p->weight=S[i-1].weight;
    }
    for(;i<=m;i++,++p){
        p->parent=0;
        p->lchild=0;
        p->rchild=0;
        p->weight=0;
    }
    for(i=n+1;i<=m;++i){
        Select(HT,n,&s1,&s2);
        HT[s1].parent=i;
        HT[s2].parent=i;
        HT[i].lchild=s1;
        HT[i].rchild=s2;
        HT[i].weight=HT[s1].weight+HT[s2].weight;
    }
    HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
    char *cd=(char*)malloc(n*sizeof(char));
    cd[n-1]='\0';
    for(i=1;i<=n;i++){
        int start=n-1;
        printf("test1");
        for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent){
            if(HT[f].lchild==c)cd[--start]='0';
            else cd[--start]='1';}
        HC[i]=(char*)malloc((n-start)*sizeof(char));
        strcpy(HC[i],&cd[start]);
        strcpy(S[i].code,&cd[start]);
    }
}
//输出哈夫曼树数据
void PrintHuffman(HuffmanTree HT,int n,s S[N]){
    printf("哈夫曼树如下所示:\n");
    for(int k=1;k<=2*n-1;k++){
        printf("%d\t",HT[k].weight);
        printf("%d\t",HT[k].parent);
        printf("%d\t",HT[k].lchild);
        printf("%d\t\n",HT[k].rchild);
    }
    printf("8个字符的字符、权值及哈夫曼编码如下:\n");
    for(int l=0;l<=n;l++){
         printf("%s\t%u\t%s\t\n",S[l].c,S[l]. weight,S[l].code);
    }
}
int main()
{
 //哈夫曼树的建立和编码的生成
    HuffmanTree HT;
    HuffmanCode HC;
    s S[N-1];
    printf("请输入8个字符,及它们的权值:\n");
    for(int i=1;i<=N;i++){
        printf("请输入第%d个字符:",i);
        scanf("%s",&S[i-1].c);
        printf("请输入该字符的权值:");
        scanf("%u",&S[i-1].weight);
        printf("%d\n",S[i-1].weight);
    }
    Huffman(HT,HC,8,S);
   
 //打印输出哈夫曼树数据
  //  PrintHuffman(HT,8,S);
 //用户输入任意一个由 N 个字符组成的字符串,输出该字符串对应的哈夫曼编码字符串
    printf("请输入一个字符串,该字符串只能包含8个字符(ABCDEFGH):");
    
    printf("\n该字符串对应的哈夫曼编码为:");


//用户输入哈夫曼编码(由 01 组成),将进行解码,输出对应的字符串
    printf("请输入一个由0或1构成的哈夫曼编码:");
    printf("\n该哈夫曼编码对应的字符串为");
    system("PAUSE");
 return 0;
}

  • 写回答

1条回答 默认 最新

  • 关注

    是你结构体数组S的最后一个元素下标越界了

    N = 8; 你这样 s S[N-1]; 是声明结构体数组S的长度只有7个元素,下标是从S[0]到S[6],没有S[7],最后一个S[7]的内存空间是不属于S数组的。虽然可以访问S[7]但不安全。因为这个内存空间可能会分配给其它变量,当这个变量的值改变时S[7]也就受到影响。

    改成 s S[N]; 就可以了

    如有帮助,望采纳!谢谢!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月27日
  • 已采纳回答 11月27日
  • 修改了问题 11月27日
  • 修改了问题 11月27日
  • 展开全部

悬赏问题

  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持