【问题标题】:linked list implementation using array only仅使用数组的链表实现
【发布时间】:2014-01-24 11:48:17
【问题描述】:

我必须只使用数组(没有 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(不是 3- 就像上面所做的那样-这样做只是为了保持递增顺序,我们只需要处理索引的移动(每个元素都是静态的(不要改变它的位置,只是索引会按递增顺序指向 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++;
}.

任何想法如何实现“下一个”部分?

【问题讨论】:

  • @bobah 你不能在 C 中使用它。
  • 我有点迷路了。您在修复下一个指针时遇到问题吗?
  • @BartlomiejLewandowski,感谢您的回复。是的,我想知道如何使每个元素的下一个指针指向大于或等于它自己的频率的元素的算法。例如,1 2 6 7 是一个数组。最初 1 的下一个指向 2,2 的下一个指向 6,然后我们在索引 0 和 1 处进行加法(我们有元素 1 和 2),然后在数组的最后添加元素。它变成了{1 2 6 7 3},现在 2 的下一个应该指向 3,而 3 的下一个应该指向 6(仅通过“指向下一个而不是通过元素移位”来保持递增顺序)。
  • @BartlomiejLewandowski 我无法为这个“下一个”设计算法,指向大于频率的元素。我需要帮助。你能帮帮我吗?
  • “仅使用数组实现链表” - 我相信这被称为“游标”,其中数组提供存储,您只需管理数组中的索引。

标签: c arrays algorithm pointers linked-list


【解决方案1】:

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

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
}

【讨论】:

  • 感谢您的回复。这是断言任何内置函数吗?
  • 它在assert.h。如果您确定新频率更大,则可以将其删除。
  • 在您编写的一段代码中,您假设初始数组元素(初始元素是指我们将应用添加过程的元素)已经定义了一些下一个,例如 index:0频率:1 下一个:1 索引:1 频率:2 下一个:2 索引:2 频率:3 下一个:3 索引:3 频率:4 下一个:-1。我说的对吗?
  • 你能解释一下这个“data[data[i].next].freq”吗?它是如何在内存中映射的?
  • 是的,它将一个新元素插入到排序列表中。 data[data[i].next].freq 是下一个元素的值(频率)。假设列表是 {(1,1),(2,2),(3,4),(4,5),(3,3),(7,-1)} (如您之前的示例),并且i = 4。那么data[i] 是(3,3),data[i].next 是3。所以data[data[i].next].freq 等于data[3].freq,等于4。
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2013-01-13
  • 2015-02-22
  • 1970-01-01
相关资源
最近更新 更多