我正在尝试在 C 中创建一个链表结构。 不过,我不太确定出了什么问题。 我的错误是:
linked.c:6:2: error: unknown type name ‘linkedList’
linked.c: In function ‘makeList’:
linked.c:30:2: error: ‘first’ undeclared (first use in this function)
linked.c:30:2: note: each undeclared identifier is reported only once for each function it appears in
linked.c: In function ‘addToList’:
linked.c:36:9: error: used struct type value where scalar is required
linked.c:43:13: error: incompatible types when assigning to type ‘int *’ from type ‘linkedList’
如果有人能看到问题所在并向我解释,将不胜感激。我的代码如下。
#include <stdio.h>
typedef struct linkedList
{
int first;
linkedList* rest;
} linkedList;
linkedList makeList(int a, int b, int c);
void addToList(linkedList* ll, int a);
int main()
{
linkedList ll = makeList(1,3,5);
addToList(&ll, 7);
addToList(&ll, 9);
return 0;
}
linkedList makeList(int a, int b, int c)
{
linkedList ll;
ll.first = a;
linkedList second;
second.first = b;
linkedList third;
third.first = c;
third.rest = NULL;
second.rest = &c;
first.rest = &b;
return first;
}
void addToList(linkedList* ll, int a)
{
while (*ll)
{
if (ll->rest == NULL)
{
linkedList newL;
newL.first = a;
newL.rest = NULL;
ll->rest = newL;
break;
} else
{
continue;
}
}
}
C 编译器在您尝试在 struct
中使用它之前没有完整的typedef
linkedList
。您有以下几种选择:
typedef struct linkedList
{
int first;
struct linkedList* rest;
} linkedList;
或:
typedef struct linkedList linkedList; // C allows this forward declaration
struct linkedList
{
int first;
linkedList* rest;
};
这是你的起点。
其他问题包括但不限于:
- 您的
makeList
函数引用变量first
但它似乎没有在任何地方定义。 -
ll->rest = newL;
为指向linkedList
的指针linkedList
分配了类型 (linkedList *
),则不能将值分配给指向值的指针。编译器错误消息linked.c:43:13:...
说明这一点。它需要ll->rest = &newL;
...然而。。。 -
newL
是函数addToList
的本地,因此您不能将其地址分配给持久列表项,因为当代码离开该块时,它将超出范围。 - 在
addToList
中,您将指向整数的指针分配给一个包含指向linkedList
的指针的变量,例如second.rest = &c;
。
这是程序的更正版本:
#include <stdio.h>
#include <stdlib.h>
typedef struct linkedList
{
int first;
struct linkedList* rest; // add struct in the beginning
} linkedList;
linkedList* addToList(linkedList* ll, int a);
void go_trough(linkedList *ll); // here's an extra function to check
int main()
{
linkedList *ll ; // working with a pointer is easier and makelist is pointless work with add to list instead
ll = NULL; // initialize to NULL
ll = addToList(ll, 7);
ll = addToList(ll, 9);
go_trough(ll);
return 0;
}
linkedList* addToList(linkedList* ll, int a) // I didn't understand what you were trying to do so ... here's my version
{
if(!ll)
{
ll = malloc(sizeof(linkedList*)); //allocating enought space to hold the structure
ll->first = a;
ll->rest = NULL;
}
else
ll->rest = addToList(ll->rest , a);
return ll;
}
void go_trough(linkedList *ll)
{
if(ll)
{
printf("%dn" , ll->first);
go_trough(ll->rest);
}
}
in makeList change
second.rest = &c;
first.rest = &b;
自
ll.rest = &second;
second.rest = &third;
在原版中,您提供了 int 变量的地址而不是 linkedList 节点。 此外,您有一个从未声明过的变量"first",这就是发生错误的地方。
还要尝试先声明所有变量,这样可以更轻松地阅读。
一些观察,
- 声明一个结构名称,以便您可以在 linkedList 结构中使用它。
- DRY - 不要重复自己,这就是为什么提供下面的ListNew()函数的原因 使用指针,无论如何,这就是
- 构建链表的重点,
- 您的列表使用一种类型的节点,存储数据和列表指针,
- 将指向列表中下一个节点的指针命名为您想要的任何名称,"下一步"怎么样?
- 将保存数据的东西命名为您想要的任何名称,那么"数据"呢?
- 打印列表,这将有助于弄清楚发生了什么,:-)
- 可以使用 %x 打印格式以十六进制打印指针
无论如何,这是一个链表,没有跟踪列表的尾部,也没有计算元素。
#include <stdio.h>
#include <stdlib.h>
typedef struct listnode
{
int data;
struct listnode* next;
} linkedList;
linkedList* makeList(int a, int b, int c);
void addToList(linkedList* ll, int a);
void ListPrint(linkedList* ll);
int main()
{
linkedList* ll = makeList(1,3,5);
addToList(ll, 7);
addToList(ll, 9);
ListPrint(ll);
return 0;
}
linkedList* ListNew(int a) //new linkedList node
{
linkedList* newL = (linkedList*)malloc(sizeof(linkedList));
newL->data = a;
newL->next = NULL;
return newL;
}
linkedList* makeList(int a, int b, int c)
{
linkedList* ll = ListNew(a);
addToList(ll, b);
addToList(ll, c);
return ll;
}
void addToList(linkedList* ll, int a)
{
if(!ll) return;
//find end of list
while (ll->next)
{
ll = ll->next;
}
ll->next = ListNew(a);
return;
}
void ListPrint(linkedList* ll) //print list
{
if(!ll) return;
linkedList* p;
for( p=ll; p; p=p->next )
{
printf("%x: %dn",p,p->data);
}
return;
}