当前位置: 首页 > 知识库问答 >
问题:

双链接列表插入到特定列表函数

卫博雅
2023-03-14

我有以下代码,它是双链表实现的一部分。然后,我必须使用我的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;
}

我需要首先创建这个表,然后添加到这个记录。

我的困难在于实现一个函数,该函数将要添加的值插入到这个特定的表中。我需要另一个插入功能,还是必须编辑我拥有的功能?

如果需要一个新的函数作为参数:一个指向结构类型的新表>代码> ListSt目< /C> >,要添加的记录的字符串和地址,我需要在参数中考虑我的列表的上一个和下一个记录吗?

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

有人能发布这样一个功能的实现吗?

共有2个答案

东门越
2023-03-14

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

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;
}
孟茂学
2023-03-14

要将项插入到(双重)链表中,唯一需要做的是引用节点,以及是否要在该节点之前或之后插入它。解决这个问题的最好方法是将其可视化。您应该始终小心,确保两种方式的引用都是正确的,并且您可能需要对其进行一些自我测试,因此指向的每个节点都指向同一个节点,否则您将面临完整性问题。

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

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

如果您了解这一点,就可以对双链接列表执行任何操作。a谢谢你给我机会做一些ascii艺术。

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

 类似资料:
  • 我正在尝试为一个项目创建一个双链接列表容器。我不能使用任何std容器。必须对双链接列表进行排序。以下是我目前的代码: 我遇到的问题是在我的插入函数中。我正在使用调试器,并在以下行插入代码:list.insert(10);。 它正确地进入第一种情况,即head==nullptr并创建节点。当我进入下一行代码(list.insert(20))时,它会用这一行创建一个节点:node*node=newno

  • 我正在尝试创建一个函数,用于在双链接列表的末尾添加。我无法精确指出为什么它没有打印出任何内容。 当我构建程序时,没有出现错误。 我正在确定。新建节点首先检查头部是否有任何值 在上一个当前指针之后创建 我将前一个节点连接到新节点,新节点指向前一个节点,而新节点指向nullptr作为下一个节点。

  • 因此,我对数据结构很陌生,我在对数组进行排序时,在尝试了几天之后,我偶然发现了双链表的插入排序。我仍然无法理解排序有什么问题,是的,我已经在线检查过,我不能只插入排序,我需要对函数参数中传递的列表进行排序,它的名称是internationSort(Dlinkedlist-arr)。 ` ` 我尝试实现它,但我被困住了,因为处理数组的逻辑有点不同,因为我们正在使用 next 和 prev 指针,这使

  • 我真的需要一些帮助来解决我已经努力了几天的地址簿程序。我正在用C语言处理双向链表。我试图在用户输入的位置将节点添加到列表中,从位置0开始。位置将不会被输入超出范围。(在位置0等位置之前,位置1没有插入)但是位置可以重复:将新节点插入在前一个位置占用者之前的位置。(例如:如果位置1有x,并且新节点插入位置1有y,则位置1现在有y,位置2有x) 我需要获取用户输入的位置号,并检索该位置的当前人员,但我

  • 我已经得到了实现双向链表的框架。我被PushFront()方法难住了。方法应该将提供的元素添加到链表的前面,并且应该将地址返回到新的头节点。我对如何访问列表的当前头部感到困惑,以便我可以将其分配给pNext指针。到目前为止,PushTop()方法看起来是这样的: 元素类构造函数: 数据类: 主要: 我的理解是,您通常会在调用PushFron()时提供头的地址,但是因为我没有提供,我不确定如何访问它

  • 下面是我当前的代码转换单链接到双向链表。我还没有接触删除功能。我已经得到插入在空列表,结束列表,开始列表显然工作。 然而,插入中间的节点似乎无法创建到前一个节点的链接。我插入的调试行似乎显示了n- 代码如下: