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

列出双向链表C项

施慈
2023-03-14

我是C语言的新手。我正在尝试创建一个双链接列表,其中数据字段是一个结构。但是当我输出元素时,只有结构的第一个字段正确显示。

struct n
{
    int a;
    int b;

};

typedef struct _Node {
    struct n *value;
    struct _Node *next;
    struct _Node *prev;
} Node;


typedef struct _DblLinkedList {
    size_t size;
    Node *head;
    Node *tail;
} DblLinkedList;


DblLinkedList* createDblLinkedList() {
    DblLinkedList *tmp = (DblLinkedList*) malloc(sizeof(DblLinkedList));
    tmp->size = 0;
    tmp->head = tmp->tail = NULL;
    return tmp;
}

void pushBack(DblLinkedList *list, struct n *value) {
    Node *tmp = (Node*) malloc(sizeof(Node));
    if (tmp == NULL) {
        exit(3);
    }
    tmp->value = value;
    tmp->next = NULL;
    tmp->prev = list->tail;
    if (list->tail) {
        list->tail->next = tmp;
    }
    list->tail = tmp;

    if (list->head == NULL) {
        list->head = tmp;
    }
    list->size++;
}
void printInt(struct n *value) {
    printf("%d, %d", value->a, value->b);
}
void printDblLinkedList(DblLinkedList *list, void (*fun)(struct n*)) {
    Node *tmp = list->head;
    while (tmp) {
        fun(tmp->value);
        tmp = tmp->next;
        printf("\n");
    }
}

所以,我有几个问题。我是否正确声明了节点值字段?我是否正确地插入了列表末尾的节点?双向链表项的输出正确吗?我的错误在哪里,如何纠正?

共有1个答案

岳嘉良
2023-03-14

我是否正确声明了节点值字段?

这取决于你的意图。在存储指向结构n的指针方面:是。

我是否正确地插入了列表末尾的节点?

是的。

我是否正确地输出双链接列表项?

是的。

我的错误在哪里?如何纠正?

从我的观点来看,代码是有效的,但可能误导的是pushBack的操作方式<代码>回推按原样获取结构n指针,并将其存储在节点中。您没有发布回推调用方代码,但是如果调用方假定结构n被复制,则当前实现可能会导致问题。

为了说明这一点,考虑以下内容:

  struct n value;
  value.a = 1;
  value.b = 2;
  pushBack(list, &value);
  value.a = 3;
  value.b = 4;
  pushBack(list, &value);

通过重用该值,两个链表节点将有效地包含相同的值。此外,插入的struct n指针必须在列表的整个生命周期内保持有效。因此,过早插入堆栈分配的值(稍后将通过离开其作用域来解除分配)或释放动态分配的值可能会导致不正确的值。只要来电者知道这一点,这就不一定是问题。

处理内存所有权通常有三种方法:

  1. 数据结构拥有值(就像它拥有节点一样),并负责释放它们

对于链表,策略3有很多优点,因为可以从现有值创建链表,而无需任何复制或所有权转移,这无疑需要更改现有代码。这就是您的代码目前正在做的事情。

 类似资料:
  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个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- 我知道还有一些关于节点交换的问题,但是我没有找到任何与我的问题相似的问题。请帮帮我...!! 提前谢谢。