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

在双向链表中标记当前位置

漆雕亮
2023-03-14
typedef struct tape
{
    char symbol;
    struct tape *next;
    struct tape *prev;
}tape;

tape *pt;

void ShowCurrentCombination()
{
    tape currentNode;


    currentNode = *pt;
    while(pt->prev != NULL)
            pt=pt->prev;

    while(pt->next != NULL)
        {
            if(pt == &currentNode) //this is never true :( 
            putc("[q]",stdout); 

            putc(pt->symbol,stdout);
                pt=pt->next;
        }
    putc(pt->symbol,stdout);
}

此函数应显示列表的内容,列表左侧用“[q]”标记当前元素。不幸的是,只显示普通数据。为什么?

为了完整起见,我来介绍一下初始化列表的函数

void GenerateInputTape(int n)
{
    int i;

    pt=(tape*)malloc(sizeof(tape));

    pt->symbol='B';

    pt->prev=NULL;
    pt->next=(tape*)malloc(sizeof(tape));
    pt->next->prev = pt;
    pt=pt->next;

    for(i=0;i<2*n+1;i++)
    {   
        if(i < (2*n/2))
            pt->symbol='0';
        else
            pt->symbol='1';


        pt->next=(tape*)malloc(sizeof(tape));
        pt->next->prev = pt;
        pt=pt->next;
    }

    pt->symbol='B';
    pt->next=NULL;
}

共有2个答案

顾梓
2023-03-14

注意两者之间的关系

currentNode = *pt;

if(pt == &currentNode)

在第一个示例中,您使用指针pt指向的内容初始化了currentNode。在第二个示例中,您正在检查currentNode的地址是否与列表中某个成员的地址相同(由pt指向)。应该很清楚为什么这永远都不可能是真的。

你需要做的是保存地址,即指针,而不是它的内容

tape *currentNodePointer = pt;

后来

if(pt == currentNodePointer)

(您的代码可以组织得更好,以避免总是“倒带”到列表的最前面,但这可能是另一天。)

阎令
2023-03-14

当你检查pt==

您希望当前节点不是一个副本,而是等于函数开头的pt的指针。

tape *currentNode;
currentNode = pt;
...
if(pt == currentNode)

您也不检查最后一个元素。

 类似资料:
  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 主要内容:双向链表的创建目前我们所学到的 链表,无论是动态链表还是 静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为 单向链表(或 单链表)。 虽然使用单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后"

  • 双向链表 结构体 struct   rt_list_node   双向链表节点 更多...   宏定义 #define  rt_container_of(ptr, type, member)   ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))   获取type结构体中member成员在这个结构体中的偏移   #de

  • 双向链表 Linux 内核自己实现了双向链表,可以在 include/linux/list.h 找到定义。我们将会从双向链表数据结构开始内核的数据结构。为什么?因为它在内核里使用的很广泛,你只需要在 free-electrons.com 检索一下就知道了。 首先让我们看一下在 include/linux/types.h 里的主结构体: struct list_head { struct l

  • 我的双链表有两个虚拟节点,头部和尾部。函数对我来说非常适合,但是当我尝试使用与相同的算法时,它会一直为我打印虚拟节点。为什么会这样? 预期结果: 我的结果:

  • 我正在尝试交换双链接列表中的两个节点。下面是具有交换功能的程序部分。 当我运行这个程序时,在第一个和第二个节点的情况下,它崩溃了。而在任何其他节点的情况下,它提供无限循环输出。(例如:-2- 我知道还有一些关于节点交换的问题,但是我没有找到任何与我的问题相似的问题。请帮帮我...!! 提前谢谢。