所以我正在编写一个程序,它使用双链表和节点来遍历它们,同时执行简单的数学运算并添加/删除类型的东西。
我们一遍又一遍地研究代码和算法,试图找到逻辑问题,但我们无法看到。当我们去构建时,它显示了大约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;
答案 0 :(得分:1)
您遇到的最大问题是在struct
typedef之前继续包含DoubleLinkedList
会导致问题。 DNode
出现同样的问题。它渗透到代码中。您需要阅读typedef struct vs struct definitions。就代码而言,您需要重新访问所有calloc
次来电。目前还不清楚你要做什么(是的,我知道你正在分配DoubleLinkedList
或DNode
,但你所尝试的是不正确的。
就是这样,我可以编译你的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;
}
此外,除非您非常需要同时包含DoubleLinkedList
和DNode
(使用无效数据类型),否则您可以通过简单的列表获得更好的服务。你正在做的是有效的,但这样做会使调试变得更加困难。有关简单的双链表示例,请参阅:Doubly Linked List (with C..)。这是一个很好的例子。