双向链接列表插入特定列表功能&参数

时间:2015-06-01 21:28:00

标签: c doubly-linked-list

我有以下代码,它是双向链表实现的一部分。然后我必须使用我的ADT实现来创建一个value形式的表(它是一个字符串),address(类型为uint32_t)(所以是2列表)。

typedef struct {
    char *label; // is a string like "mov".
    uint32_t labelAddress; // the address of the label.
} individualEntry;

typedef void( *FreeList )( void* );

typedef struct listEntries {
    individualEntry newInstr;
    struct listEntries *prev;
    struct listEntries *next;
} listEntries;

listEntries *head;

/*
 * HELPER FUNCTIONS
 */

listEntries *createNewList() {
    listEntries *newListPtr = malloc(sizeof(listEntries));
    return newListPtr;
}

listEntries *createNewEntry( char *label, uint32_t address ) {
    listEntries *newEntry = (listEntries*) malloc(sizeof(listEntries));
    newEntry->prev = NULL;
    newEntry->next = NULL;
    newEntry->newInstr.label = label;
    newEntry->newInstr.labelAddress = address;
    return newEntry;
}

void insert( char *label, uint32_t address ) {
    listEntries *temp = head;
    listEntries *newEntry = createNewEntry(label, address);
    if ( head == NULL ) {
        head = newEntry;
        return;
    }
    while ( temp->next != NULL ) {
        temp = temp->next;
    }
    temp->next = newEntry;
    newEntry->prev = temp;
}

我需要先创建此表,然后将记录添加到此表中。

我的困难在于实现一个函数,该函数将要添加的值插入此特定表。我是否需要其他插入功能,或者我是否需要编辑我的插件功能?

如果我需要一个新函数作为参数:指向struct listEntries类型的新表的指针,要添加的记录的字符串和地址,我是否需要在参数中考虑前一个和我列表的下一个记录?

我不确定如何在插入后处理上一个和下一个指针。

有人可以发布这样一个函数的实现吗?

2 个答案:

答案 0 :(得分:4)

将项目插入(双重)链接列表中唯一需要的是参考节点,以及是否要在该节点之前或之后插入它。解决这个问题的最佳方法是将其可视化。您应该始终小心,确保两种方式的引用都是正确的,并且您可能应该对其进行一些自检,因此每个节点指向,指向同一节点,否则您有一个诚信问题。

现在可视化。可以这样想(双线表示双链接):

A = B = C

假设我想在最后添加一个项目到这个列表,我只需要告诉C指向该项目,例如:

A = B = C - D

并指出该项目:

A = B = C = D

现在,如果我想将D移动到另一个位置,比如在第二个位置,我可以让参考节点'A'指向'D':

A - B = C = D
 \_________/

让D指回A

A - B = C - D
 \`========'/

让C不再指向D:

A - B = C   D
 \`========'/

让D指向B:

      ______
     /      \
A - B = C   D
 \`========'/

请B指回D:

      .=====
     //     \\
A   B = C   D
 \`========'/

正如您现在所看到的,B不再指向a,并且在视觉上重新排列这可以解决问题:

   C = B ===.
           \\
A           D
 \`========'/

等于:

A = D = B = C

如果你理解这一点,你可以在双向链表上进行任何操作。 一个 谢谢你有机会做一些ascii艺术。

总结一下:你实际上并没有“列表”。您只有节点,指向另一个指向的节点,或者没有任何节点(NULL)。

答案 1 :(得分:1)

所以这是我对自己问题的回答(编译,测试,并且有效)。我使用了迭代器,感谢上面的可视化,但我需要更多提示,比如迭代器这个词。

void insert(struct list *listPtr, listIterator iter, int value) { 

struct listEntry *newEntry = list_alloc_elem(); // a helper that allocates memory for an individual entry; 
newEntry->value = value;
newEntry->prev = iter->prev;
newEntry->next = iter;
iter->prev->next = newEntry;
iter->prev = newEntry;
}