如何删除数组中任何特定位置的任何元素?

时间:2014-01-10 22:19:12

标签: c arrays segmentation-fault huffman-code

我遇到了编程问题,我必须添加数组的前两个索引,然后它们的总和必须位于第一个位置(删除已添加的两个节点),当然必须导致向前移动数组的一个索引位置。 但问题是,它的变化非常奇怪。 请仔细查看,我只需要使用数组,没有其他数据结构 这是我想要的清晰画面。见例子:

arr[5]= {1,2,3,4,5}
First execution:
{3,3,4,5} //here we added first two elements (1+2=3)
second execution:
(6,4,5) //again added first two elements
third execution:
{10,5}
finally:
{15}

我的代码是:

    Node *temp;
    Node *array[5]; //actually this array is declared like this {1,2,3,4,5}
    int i;
    for (i=0;i<5;i++)
    {
        array[i] = malloc(sizeof(Node));
        array[i]->value = freq[i+1];//this contains {1,2,3,4,5}
        array[i]->sym = arry[i];
        array[i]->left = NULL;
        array[i]->right = NULL;
    printf("%d  ",array[i]->value );
    }
    int j=0,d,t=5;
      while (t>1 )
 {

        temp = array[j];
        printf(" \ncheckOne %d  ",array[j]->value);
        printf("checkTwo %d  \n",array[j+1]->value );
        array[j]->value= temp->value + array[j+1]->value; //
        printf(" checkSumOfOneAndTwo %d  \n",temp->value);
        array[j]=array[j+1];
        array[j]->left=array[j+1];
        array[j]->right=temp;
        array[j]=temp;

            for(d=0;d < t;d++)
        printf(" %d  ",array[d]->value);
        t--; 
        j++;
    }

它的输出是:

  The Frequencies corresponding to alphabets in Input.txt  files are as follows 
: a  b  c  d  e  
1  2  3  4  5   
checkOne 1  checkTwo 2  
 checkSumOfOneAndTwo 3  
 3   2   3   4   5   
checkOne 2  checkTwo 3  
 checkSumOfOneAndTwo 5  
 3   5   3   4   
checkOne 3  checkTwo 4  
 checkSumOfOneAndTwo 7  
 3   5   7   
checkOne 4  checkTwo 5  
 checkSumOfOneAndTwo 9  
 3   5  

我是编程的初学者。请问任何人请告诉我错误是什么以及如何解决? (我不得不使用数组实现它 - 所以没有链接列表,堆等等。)

2 个答案:

答案 0 :(得分:0)

这段小代码本身就是一个问题:

    array[j]=array[j+1];
    array[j]->left=array[j+1];

执行上面的代码后,你有一个“左”指针指向自身的节点。

我首先要解决这个问题。

<强>更新

为了有效地构建Huffman树,您应该使用二进制堆(最小值在顶部)而不是数组。在每次迭代中,您应该提取根两次,将两个节点合并为一个,然后将结果推回到堆中。

更新#2:

如果您坚持使用数组而不是二进制堆,那么您的代码中会出现基本的概念错误:

整个执行期间,您的数组必须按照最小到最大的顺序排序。

您从排序数组开始,但不确定它是否在每次迭代结束时保持排序。

简而言之,在总结前两个元素之后,不能简单地将结果作为数组中的第一个节点。相反,您必须将该节点“传播”到数组中的正确位置,以便将其从最小到最大排序。

如果不能这样做,可能会导致工作代码,但霍夫曼编码/解码的实现不正确。

更新#3:

如果您坚持使用数组而不是二进制堆,下面的代码只是构建Huffman树的一般框架。我还没有验证过。

    // Create a new node, whose children are the first two nodes in the array
    temp = malloc(sizeof(Node));
    temp->value = array[0]->value + array[1]->value;
    temp->left  = array[0];
    temp->right = array[1];

    array_size--;

    // Push the new node into the array, and move all elements 1 entry backwards
    array[0] = temp;
    for (int k=1; k<array_size; k++)
    {
        array[k] = array[k+1];
    }

    // Move the new node forward, until the array is properly sorted (min-to-max)
    for (int k=1; k<array_size; k++)
    {
        if (array[k-1]->value < array[k]->value)
            break;
        temp = array[k-1];
        array[k-1] = array[k];
        array[k] = temp;
    }

答案 1 :(得分:0)

#include <stdio.h>
#include <stdlib.h>

int main(){
    int stack_size = 5;
    int sp = stack_size;
    int *stack = malloc(stack_size * sizeof(int));//int stack[5];
    int i;
    for(i=stack_size; i>0 ;--i){
        stack[--sp] = i;//push
    }
    //print stack
    printf("{ " );
    for(i = sp;i<stack_size;++i)
        printf("%d ", stack[i]);
    printf("}\n");

    int t = stack_size;
    for(t=stack_size;t > 1;--t){
        int first, second;
        first = stack[sp++];//pop
        second = stack[sp++];//pop
        stack[--sp] = first + second;//push

        printf("{ " );//now stack print 
        for(i = sp;i<stack_size;++i)
            printf("%d ", stack[i]);
        printf("}\n");
    }

    free(stack);
    return 0;
}
/* result
{ 1 2 3 4 5 }
{ 3 3 4 5 }
{ 6 4 5 }
{ 10 5 }
{ 15 }
*/