Tag: linked list

结构和指针指针

我正在学习链接列表以及如何使用结构和指针在C中创建它们。 我在下面有一个例子。 根据我的理解,被调用的push()传递结构的起始内存位置,其中头节点作为参数。 我们的push()函数的参数将struct节点作为指针的指针,因此它作为引用而不是实际副本传递。 因此,我们的struct node ** headref的第一个指针只是指向头节点的内存位置的指针,第二个指针指向该值,该值是头节点指向的下一个内存位置。 我们在struct节点中创建一个名为newnode的新节点,为它分配一些内存。 然后,我们在此节点内创建一个int类型数据。 好吧,假设我说的一切都是正确的,下一部分就是我对此感到困惑。 newNode->next= *headRef; 从我能理解的这一行取消引用headref所以这将使headref指向头节点。 然后我们有一个指针操作,其中headref指向的内容也将是我们的指针接下来指向的内容。 基于此,我们的新节点(newnode)中的下一个指针将指向头指针。 我也困惑的下一行是: *headRef = newNode; 取消引用的headref指针指向的是头节点,现在将指向我们的newnode。 基于此,应该有一个名为newnode的新节点,其中包含一个int数据,另一个指针将我们的newnode链接到头部。 然后headref指针(或者它是头节点?)将指向新节点。 我知道这是不正确的,因为我们的newnode旁边的指针应该指向第二个节点,所以我们的newnode可以在struct中链接。 我也不相信我理解上面两行代码中指针和解除引用的指针。 码: void Push(struct node** headRef, int data) { struct node* newNode = malloc(sizeof(struct node)); newNode->data = data; newNode->next = *headRef; *headRef = newNode; } void PushTest(void) { struct node* head […]

使用mergesort对链接列表进行排序

我目前正在研究mergesort算法。 我有三个function。 list_sort_merge,mergelist和splitlist。 list_sort_merge调用另外两个来拆分和合并列表。 我无法正常工作。 那么当我运行GDB时会发生的事情是我通过split函数并自己获取每个数字,例如以下示例: 427 42.7 4.2.7 然后mergesort出现了,并且我发生了段错误。 会发生什么是right_list和left_list没有传递给mergesort。 当mergesort在函数comp_proc中进行比较时,它表示它们都是NULL。 我认为问题来自分裂function。 谁能看到我在这里做错了什么?

C链表中的内存泄漏

我一直在为学校做一个项目(今晚到期!),我有一些严重的记忆问题。 我对C很新,当涉及到mallocing指针等等时,我仍然被抛出一个循环,所以我真的可以使用一些帮助。 代码如下。 文件的顺序是LinkedLists.h(LinkedList模块的Header),LinkedLists.c(LinkedList模块)和TestList.c(主模块)。 /****************************************************************************** * Base struct to contain data structure element information: deterimined by * the application needs. ******************************************************************************/ #ifndef _LINKED_LISTS_H_ #define _LINKED_LISTS_H_ typedef struct ElementStructs { int ElementPosition; char* ElementValue; } ElementStructs; /************** Nothing else in the module needs to be modified *************/ /****************************************************************************** * Base struct of list nodes, contains user […]

完美平衡的二进制搜索树

我有关于Balanced BST的理论问题。 我想构建具有2^k – 1节点的Perfect Balanced Tree ,来自常规的unbalanced BST 。 我能想到的最简单的解决方案是使用排序的Array/Linked list并递归地将数组划分为子数组,并从中构建Perfect Balanced BST 。 但是,在树大小非常大的情况下,我需要创建一个相同大小的Array/List ,因此这种方法会占用大量内存。 另一种选择是使用AVL旋转function,逐个元素插入并根据树平衡因子平衡树和旋转 – 左和右子树的三个高度。 我的问题是,我对我的假设是对的吗? 还有其他方法可以从不平衡的BST创建完美的BST吗?

传递struct的字段名称以访问函数内部

我有一个链表,我做了一个获取节点的function。 但我想用它来搜索名字或姓氏。 typedef struct people { char name[60], lastname[60]; struct people *next; } people; people *search(const char *key, people *list, FIELD) { while (list && strcmp(key, list->FIELD) != 0) { list = list->next; } return list; } 例: people *aux; aux = search(“John”, list_of_people, “name”); 要么: aux = search(“Smith”, list_of_people, “lastname”); 有一种清晰有效的方法来解决这个问题而不重复代码?

在C中的链表上插入排序?

我试过寻找类似于我的问题,但没有找到太多帮助。 我有这种结构的链表: struct PCB { struct PCB *next; int reg1, reg2; }; 我首先创建10个以这种方式链接在一起的PCB结构: for(i=20;ireg1 = i; curr->next = head; head = curr; } 然后我需要再创建20个PCB结构,但是需要使用rand()生成它们的reg1值。 我正在这样做: for (j = 0;jreg1 = rand()%100; curr->next = head; head = curr; } 但是,当使用随机reg1值将这些PCB结构插入到链表中时,我需要按顺序将它们插入到链表中(插入排序)。 在单链接链表中处理此问题的最佳方法是什么? 谢谢 编辑:我现在正在跟踪第一个创建的结构,以便能够从头开始循环链接列表: // create root struct to keep track of beginning of linked list root […]

堆使用链接列表排序

我想知道是否有人曾使用链表进行堆排序,如果有人可以提供代码。 我已经能够使用数组进行堆栈操作,但是尝试在链接列表中进行操作似乎是不切实际的,只是你知道在哪里痛苦。 我必须为我正在做的项目实现链接列表,任何帮助将不胜感激。 我也在使用C.

C通用链表

我有一个通用链接列表,其中包含void *类型的数据我试图用类型struct employee填充我的列表,最终我想破坏对象struct employee。 考虑这个通用的链表头文件(我用char *类型测试过它): struct accListNode //the nodes of a linked-list for any data type { void *data; //generic pointer to any data type struct accListNode *next; //the next node in the list }; struct accList //a linked-list consisting of accListNodes { struct accListNode *head; struct accListNode *tail; int size; }; void accList_allocate(struct […]

队列性能明智,这是更好的实现 – 数组或链接列表

当我必须插入很少的元素时,哪种方式可以提供更快的入队和出列,是否数组比链表更好? 我需要插入一些元素,我必须从队列中删除并读取已删除的元素。 如果是数组,我可能每次删除元素时都要修改索引。 插入和删除也可能同时发生。 从下面的案例中哪个更好? typedef struct{ mylist list; struct mylistQ *next; }mylistQ; 数组代码 static mylist myListQ[QUEUESIZE+1]; int qLast = 0; void enqueue_element(mylist qItem) { myListQ[qLast] = qItem; qLast++; } mylist dequeue_element() { retryq: if(qLast >0) { mylist qReturn = myListQ[0]; int i; for (i = 0; i < qLast – 1; i++){ myListQ[i] = […]

在C中创建和理解结构的链接列表

我无法一起掌握struct和链表数据结构的概念。 例如,假设我们有这样的代码:一个具有worker的内容的struct ,这些struct的链表包含每个worker的节点和指向下一个节点的指针(?)。 typedef struct Schedule { char name[10]; char description[10]; int hours; int workordernum; } Work; typedef struct linkedlist { struct Schedule work; struct linkedlist *next; } Node; 问题是如何创建一个始终在列表开头添加节点的方法,一种使用用户定义的workordernum将其添加到列表中任何位置(中间)的方法,以及始终将其添加到最后的方法。 我不太了解->和*正确使用。 我确实在网上阅读了有关创建头部和尾部节点的信息,但我没有正确使用它,因为它们有一个列表struct和一个节点struct 。 我没有得到的另一件事是,假设在列表的开头添加一个节点,你如何改变以前所有节点的每个workordernum值呢? 我理解每次添加,删除或移动节点时都必须跟踪,这意味着每次调用这些方法时,我们必须有一个跟踪数字的变量。 因此,如果列表中的节点都已准备就绪,其顺序为1,那么我们在开头添加另一个节点,如何将订单号1更改为2,将1添加到1? 或者如果我们只有一个指针,node-> next-> next-> next怎么工作? 然后我们将如何打印所有这些? 因为我们不能使用for循环。 所以这些是我无法把握代码的概念。 如果你花时间解释它,而不是仅仅给出代码,如果可能的话,我会非常感激。 因为我必须应用我学到的东西来移动并删除节点。 我想自己学习。 如果必须给出一些代码示例,那就没关系,但请不要为我发布所有答案代码。 -谢谢 *请原谅任何格式错误,因为我是这个网站的新手。 编辑:我确实理解指针是一个地址,并且->属于“指向”一个成员。 我的意思是我理解所有基础知识,但我的理解不够坚定,否则我可以做我需要帮助的事情。 编辑2:我将尝试使用我目前学到的链接列表创建一个头节点。 我将使用上面的结构,它将是松散的代码,而不是完美的。 这只是为了确保我到目前为止在正确的轨道上。 int […]