- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图在 C 中创建一个双向链表,但它不起作用,我也不知道为什么。它只打印我介绍的最后一个元素。我在创建列表的代码部分没有看到任何问题。也许你能看到它?
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
struct node *prev;
}NodeT;
struct d_linked_list
{
NodeT *first;
NodeT *last;
};
int main()
{
int d;
struct d_linked_list *l;
NodeT *p,*q;
p=(NodeT*)malloc(sizeof(NodeT));
q=(NodeT*)malloc(sizeof(NodeT));
l->first=NULL;
l->last=NULL;
while (fscanf(stdin,"%d",&d)!=EOF)
{
p->data=d;
if (l->first==NULL)
{
l->first=p;
l->last=p;
p->next=NULL;
p->prev=NULL;
}
else
{
l->last->next=p;
p->prev=l->last;
l->last=p;
}
}
l->last->next=NULL;
for (q=l->first;q!=NULL;q=q->next)
printf("%d ",q->data);
return 0;
}
最佳答案
像往常一样,有很多问题,其中一些已经在其他答案或评论中发现,还有一些(我认为)以前没有发现:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
struct node *prev;
}NodeT;
struct d_linked_list
{
NodeT *first;
NodeT *last;
};
到目前为止,还不错。
int main()
{
int d;
struct d_linked_list *l;
您没有为l
分配空间。使用起来可能更简单(因此可能更好):
struct d_linked_list head; // Or maybe list instead of head
然后在你的代码中引用head
而不是l
;您也可以使用 l = &head;
而无需进一步更改。
NodeT *p,*q;
p=(NodeT*)malloc(sizeof(NodeT));
q=(NodeT*)malloc(sizeof(NodeT));
您永远不会使用分配给 q
的空间,您最终会覆盖它,从而导致泄漏。您应该检查 malloc()
是否工作,如果失败则做一些适当的事情(停止并显示错误消息?)。
l->first=NULL;
l->last=NULL;
while (fscanf(stdin,"%d",&d)!=EOF)
您应该使用 while (fscanf(stdin, "%d", &d) == 1)
检查您是否得到一个整数;循环在 EOF 或转换失败时中断。
{
p->data=d;
您在循环之前分配了 p
,但每个后续条目都覆盖了相同的空间。您需要为读取的每个值分配一个新节点。 (这之前并未被确定为问题——尽管我在输入我的代码时看到 Filipe Gonçalves 将其添加到他的 answer 中。)
if (l->first==NULL)
{
l->first=p;
l->last=p;
p->next=NULL;
p->prev=NULL;
}
else
{
l->last->next=p;
p->prev=l->last;
l->last=p;
}
}
从表面上看,上面的代码看起来还不错;我没有运行它,所以可能存在我没有发现的问题。
正如 Filipe 指出的那样,我注意到“未彻底检查”并且确实存在问题。 if
子句是可以的,我认为,但是else
子句需要设置p->next = NULL;
。一般来说,完全创建节点是个好主意:p->data = d; p->下一个=空; p->prev = NULL:
然后将节点hook到链表中。
l->last->next=NULL;
这一行应该是不必要的。在循环的每个循环结束时,列表应该正确形成。测试这一点的一种方法是在每个循环中打印出列表的内容(使用函数)。您还可以使用该函数代替后面的循环。我经常使用的一个界面设计是:
void dump_list(FILE *fp, char const *tag, struct d_linked_list const *list)
在给定的文件流上打印识别标签和列表的内容。我为每个重要的数据结构保留了这样的函数,以便以后更容易调试。
for (q=l->first;q!=NULL;q=q->next)
这个循环丢失了分配给 q
的空间。
printf("%d ",q->data);
你应该在某个时候输出一个换行符。
您还应该完成释放所有分配空间的 Action ,只是为了确保您知道如何做到这一点。当你要退出一个程序时,这并不重要,但如果你在一个长时间运行的程序中使用该列表,该程序每分钟需要一个列表,然后关闭并执行不相关的操作,那么你会泄漏所有内存,您的长时间运行的程序将在一段时间后停止运行,因为它缺少必要的内存(因为它泄漏了——浪费了——列表中的内存)。
return 0;
}
关于c - 双向链表没有正确创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22439109/
今天我们将开始第二个数据类型-链表的学习,同样我们还是用最原始的方式,自己申请内存管理内存来实现一个链表。 01、01、定义 什么是链表?链表在物理存储结构上表现为非顺序性和非连续性,因此链表
前言:笔记是参考B站up主尚硅谷,图片、代码都是哦。在blog写笔记~(图片、代码来源尚硅谷,侵权必删!) 尚硅谷数据结构学习路线B站网站:https://www.bilibili.com/video
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我想创建一个没有全局变量的单个链表。我用 NULL 初始化了第一个元素,然后想将第一个元素 node 复制到 list_。它被复制到函数中,但副作用不起作用。在我的主函数中,该值仍然是NULL。如果我
我正在尝试使链表与此处的链表相似: linked list in C 那就是在另一个结构中有“头”,我首先称它为“头”。但是我发现做那个改变。很难向 list_item 结构添加值。我已经尝试了一些东
我正在尝试理解链表的代码。我明白他们是如何工作的。我正在查看一些与动态内存和链表有关的代码,我在此处对其进行了简化: #include #include typedef struct nod
有人可以解释下面的代码吗?我是 C 的新手,正在努力弄清楚。为什么我们最后有 queueNodeT? typedef char queueElementT; typedef struct queueN
场景如下:- 我想反转单链表的方向,换句话说,反转后所有指针现在应该指向后.. 这个算法应该需要线性时间。 我想到的解决方案是使用另一个数据结构 A Stack.. 借助它可以轻松反转单向链表,所有指
在 python 中使用链表最简单的方法是什么?在 scheme 中,链表由 '(1 2 3 4 5) 定义。 Python 的列表 [1, 2, 3, 4, 5] 和元组 (1, 2, 3, 4,
本文首发公众号:小码A梦 一般数据主要存储的形式主要有两种,一种是数组,一种是链表。数组是用来存储固定大小的同类型元素,存储在内存中是 一片连续 的空间。而链表就不同于数组。链表
虽然之前有人问过关于链表与数组的问题,但答案大多归结为我们大多数人在某个时候可能已经学到的东西: 列表擅长插入和删除 数组擅长随机访问 现在像 Bjarne Stroustrup 这样受人尊敬的人有
位置 在堆中,碎片化(每个节点的 malloc) - 在几种不同的方式(缓慢分配,缓慢访问,内存碎片)方面效率低下 在堆中,在一个大块中 - 当需要重新分配 时,数据结构获得的所有灵活性都将丢失 在堆
我完成了泛型的学习,但并不容易。不过,我确实明白了。这是我的理解。我希望您纠正我的错误并回答几个问题:)。 public class LinkedList { //class definition }
我将如何创建一个链接列表来在 OCaml 中保存我的数据?我正在尝试制作一个单链表,但是我遇到了语法问题。我只想制作一个模块来简单地从链表中获取'a,插入'a或删除'a。 有人知道吗? 最佳答案 正如
我在使用这段代码时遇到了问题,我不确定我做错了什么 #include #include #include #include typedef struct flight_struct{
我正在创建一个函数来删除给定列表的最后一个节点(作为参数输入)。该函数本身非常简单,如下所示。 function popBack(list) { var current = list.head
我正在尝试开发一种方法,该方法将在链接列表中的当前节点之前插入传递给它的节点。它有3个条件。对于此实现,不能有任何头节点(仅对列表中第一个节点的引用),并且我无法添加更多变量。 如果列表为空,则将传递
使用 scala,我已将大约 100000 个节点添加到链表中。当我使用函数 length 时,例如 mylist.length。我收到“java.lang.StackOverflowError”错误
所以我正在学习处理链表。我将如何递归地添加节点内的项目。我可以通过执行 sum = h.item +h.next.item+h.next.next.item 添加它们,但这只有在我有小的链接列表时才有
所以我一直在努力理解链表的概念(一直在看一些示例代码,我在互联网上找到了这个。现在如果我能请别人确认我是否正确掌握了一些概念。我将绘制图表,说明我认为每个代码链接的作用。 #include #inc
我是一名优秀的程序员,十分优秀!