取消引用指向未编译的不完整类型的指针

时间:2014-06-27 02:29:18

标签: c

所以我正在编写一个程序,它使用双链表和节点来遍历它们,同时执行简单的数学运算并添加/删除类型的东西。

我们一遍又一遍地研究代码和算法,试图找到逻辑问题,但我们无法看到。当我们去构建时,它显示了大约43个错误,主要是“解除引用”问题,我有用于遍历列表的临时节点。我们有一个.c文件和一个.h文件。

typedef结构在.h中定义.h和.inc中的#include。我们无法弄清问题在哪里。我在此pastebin中链接了代码:http://pastebin.com/PLT3K8kX

void insertDListElementAt(DoubleLinkedList* list, Object newElement, uint position){

    struct DNode* newNode = calloc(list, sizeOf(newElement));
    newNode->data = newElement;

    int counter = 0;

    struct _DNode* current = list->head;

    while(counter < list->length){

                    if(counter == position){

                            current->next = newNode;
                            newNode->prev = current;
                            newNode->next = current->next;
                            current->next->prev = newNode;

                    }
                    counter++;
                    current = current->next;
            }

}

这是一个由该程序组成的示例函数。解除引用问题的地方是变量'NewNode'指向下一个或上一个。我无法弄清楚实际问题是什么,因为所有的typedef都列在.h。

我的代码中的typedef示例:

typedef struct _DNode{

Object data;

struct _DNode* prev;

struct _DNode* next;

} DNode;

1 个答案:

答案 0 :(得分:1)

您遇到的最大问题是在struct typedef之前继续包含DoubleLinkedList会导致问题。 DNode出现同样的问题。它渗透到代码中。您需要阅读typedef struct vs struct definitions。就代码而言,您需要重新访问所有calloc次来电。目前还不清楚你要做什么(是的,我知道你正在分配DoubleLinkedListDNode,但你所尝试的是不正确的。

就是这样,我可以编译你的doublelinkedlist代码。除了提供差异之外,没有简短的方法来显示变化。 (使用diff -uNrb创建)这将帮助您入门:

--- DoubleLinkedList.c
+++ DoubleLinkedList.c  2014-06-26 22:59:35.768919428 -0500
@@ -19,13 +19,13 @@
#include "DoubleLinkedList.h"


-typedef struct DNode mainTemp;
-typedef struct DoubleLinkedList mainList;
+DNode mainTemp;
+DoubleLinkedList mainList;

//1 DONE
-DoubleLinkedList* allocDList(uint elementSize){
+DoubleLinkedList* allocDList (uint elementSize) {

-   struct DoubleLinkedList* list = &mainList;
+        DoubleLinkedList* list = &mainList;

        list->head = NULL;
        list->tail = NULL;
@@ -35,18 +35,16 @@

        return list;

-
-
}
//2 DONE
void releaseDList(DoubleLinkedList* list){

-   struct DNode* node = list->head;
-   struct DNode* next = NULL;
+   DNode* node = list->head;
+   DNode* next = NULL;

        while(node){

-       struct DNode* next = node->next;
+       DNode* next = node->next;
                free(node);
                node = next;

@@ -56,12 +54,12 @@
//3 DONE
void insertDListElementAt(DoubleLinkedList* list, Object newElement, uint position){

-   struct DNode* newNode = calloc(list, sizeOf(newElement));
+   DNode* newNode = calloc (1, sizeof(newNode));  // allocating newNode or list?
        newNode->data = newElement;

        int counter = 0;

-   struct _DNode* current = list->head;
+   DNode* current = list->head;

        while(counter < list->length){

@@ -81,7 +79,7 @@
//4 DONE
void appendDList(DoubleLinkedList* list, Object newElement){

-   struct DNode* newNode = calloc(list, sizeOf(newElement));
+   DNode* newNode = calloc(1, sizeof(newNode));  // allocating newNode or list?
        newNode->data = newElement;

        newNode = list->tail->next; // setting newNode as current tail's next
@@ -95,7 +93,7 @@



-   struct DNode* newNode = (DNode*)calloc(list, sizeOf(newElement));
+   DNode* newNode = calloc(1, sizeof(newElement));

        newNode->data = newElement;

@@ -109,12 +107,12 @@
//6 DONE
DoubleLinkedList* reverseDList(DoubleLinkedList* list){

-   struct DoubleLinkedList* newList = NULL;
-   newList = (struct DoubleLinkedList*) malloc(sizeOf(DoubleLinkedList));
+   DoubleLinkedList* newList = NULL;
+   newList = malloc(sizeof(DoubleLinkedList));

-   struct DNode* temp = NULL;
+   DNode* temp = NULL;

-   temp = (DNode*)malloc(sizeOf(DNode));
+   temp = malloc (sizeof (DNode));

        temp = list->tail;

@@ -136,9 +134,9 @@
//7 DONE
DoubleLinkedList* halfList(DoubleLinkedList* list){

-   struct DNode* slow = list->head;
-   struct DNode* fast = list->head;
-   struct DoubleLinkedList* newList = malloc(uint);
+   DNode* slow = list->head;
+   DNode* fast = list->head;
+   DoubleLinkedList* newList = malloc (sizeof (uint));

        if(list->head != NULL){

@@ -166,7 +164,7 @@
Object removeDList(DoubleLinkedList* list, int position){

        int counter = 0;
-   struct _DNode* temp = list->head;
+   DNode* temp = list->head;

        while(counter < list->length){

@@ -189,11 +187,11 @@
//9 DONE
void printDList(DoubleLinkedList* list){

-   struct _DNode* temp = list->head;
+   DNode* temp = list->head;

        while(temp->next != NULL){

-       printf("%d", temp->data);
+       printf ("%d", temp->data);
                temp = temp->next;

        }

此外,除非您非常需要同时包含DoubleLinkedListDNode(使用无效数据类型),否则您可以通过简单的列表获得更好的服务。你正在做的是有效的,但这样做会使调试变得更加困难。有关简单的双链表示例,请参阅:Doubly Linked List (with C..)。这是一个很好的例子。