仅使用数组的链表实现

时间:2014-01-24 11:48:18

标签: c arrays algorithm pointers linked-list

我必须使用数组(没有malloc-only静态内存)实现一个链表类型的数据结构。 我到底要做的是这样的: (1)我有一组元素数组,比方说数组[216] = {1 2 3 4}(我将采用非常大的尺寸,这就是为什么216这里)。

(2)我必须在索引0,1和2,3和4,5等处添加(在索引0,1处我们有“1”,“2”,它们的加法是= 3)。然后这个3将被定位在数组的最后(我的意思是在“6”之后,所以数组现在是:= {1 2 3 4 3})。 我已经实现了。

*我要做的是:

(3)我必须制作这样的程序,每个元素必须具有它的值(假设我在我的代码中将值称为“Freq”)和它指向的下一个元素的索引以及最后一个没有任何指向的元素必须在下一个包含“-1”。如下所示: **我还没有完成添加,它是最初的,添加完成后它的大小将会增长(请参阅最后的内容)。 在添加之前,数据结构如下:

index:0 Freq: 1 Next :1
index:1 Freq: 2 Next :2  
index:2 Freq: 3 Next :3 
index:3 Freq: 4 Next :-1

(4)这个指点必须按递增顺序,我的意思是你可以在下面看到我的意思是如果我们在指数0,1加上Freq我们将获得3然后这3是设置为数组的最后一个索引,我们可以看到在索引2处,下一个指向索引4(而不是正如上面做的那样 - 它只是为了维持增加的顺序,我们只需要处理索引的运动(每个元素都是静态的(不要改变它的位置,只需索引就会按顺序指向Freq。)。)。

(这部分很容易实现,我已经完成了。) 当我必须在第(2)点提到的索引中添加时,我遇到了问题。 数据结构必须如下所示:(添加后) 添加后:

index:0 Freq: 1 Next :1
index:1 Freq: 2 Next :2  
index:2 Freq: 3 Next :4 //It don't point to index 3.In order to mantain increasing order
index:3 Freq: 4 Next :5
index:4 Freq: 3 Next :3 //this is obtained by addition of Freq at index 0 and 1
index:5 Freq: 7 Next :-1 //this is obtained by addition of Freq at index 2 and 3 

知道如何实现第二部分吗?(添加后)。 我的代码是(直到添加方 - 非索引部分):

struct node
{
int freq;
int next;
};
main()
{
int i,count=0,j,f,s,data_size;
struct node data[1000];


//I am skipping sime understood part

data[data_size].freq=data[f].freq+data[s].freq;//where data_size=**elementsSize+1** .In out case there are 4 elements so data_size=5.The added element is to be placed at last.That's why i too it **"elementSize+1"**.
data_size++;
}.

有关如何实施“下一步”的任何想法吗?

1 个答案:

答案 0 :(得分:0)

您是否在询问如何插入元素并使列表按升序排列?

int insert(struct node *data, int new_freq, int data_size) {
    // Impossible if new_freq is less than first element,
    // because you don't have a head pointer(index)
    assert(data[0].freq <= new_freq);

    int i;
    for (i = 0; data[i].next != -1; i = data[i].next)
        if (data[data[i].next].freq > new_freq) // insert after i
            break;
    // insert at end of array if loop doesn't break

    data[data_size].freq = new_freq;
    data[data_size].next = data[i].next;
    data[i].next = data_size;
    return data_size + 1; // return new size
}