我是C的新手。 我建立了一个这样的链表:
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#define len(array) (sizeof(array) / sizeof(array[0]))
#define true 1
#define false 0
struct node{
int data;
struct node* next;
};
typedef struct node node;
node* initNode(void){
node* headNode;
headNode = (node *)malloc(sizeof(node));
headNode -> next = NULL;
return headNode;
}
node* create(int* array, int length){
node* newNode;
node* lastNode;
node* headNode = initNode();
newNode = (node *)malloc(sizeof(node));
headNode -> data = array[0];
int arrayLength = 1;
int hasSetHead = false;
while(arrayLength < length){
if (! hasSetHead){
lastNode = headNode;
hasSetHead = true;
}
memset(newNode, 0, sizeof(node));
newNode -> data = array[arrayLength];
newNode -> next = NULL;
lastNode -> next = newNode;
lastNode = newNode;
newNode = (node *)malloc(sizeof(node));
if (newNode == NULL) exit(0);
arrayLength++;
}
return headNode;
}
void clear(node* headNode){
node* nextNode;
if (headNode == NULL) return;
while (headNode -> next != NULL){
nextNode = headNode -> next;
free(headNode);
headNode = nextNode;
}
*headNode = NULL;
}
int main(void){
int array[] = {1,2,3,4,5,6,7};
int length = len(array);
node* list = create(array, length);
clear(list);
system("pause");
return true;
}
我想通过使用clear(struct pointer)清除我的结构。 但是在clear()的最后一行,我得到了这个错误:
error: incompatible types in assignment
我该怎么办? 谢谢!请忘记我可怜的英语。
谢谢!@Marievi 我改变了这样的代码:
headNode = NULL;
但是当我想要打印链表时。它似乎坏了,这是我的代码:
void clear(node* headNode){
node* nextNode;
if (headNode == NULL) return;
while (headNode -> next != NULL){
nextNode = headNode -> next;
free(headNode);
headNode = nextNode;
}
*headNode = NULL;
}
当我调用此函数时,似乎是泄漏。
答案 0 :(得分:1)
更改行:
*headNode = NULL;
到:
headNode = NULL;
并且错误将消失。
此外,do not cast the result of malloc始终check if malloc was successful。
答案 1 :(得分:0)
在您的函数中声明headNode
为
node* headNode
,相当于
struct node *headNode
因为类型为node
的范围内的typedef。有问题的任务
*headNode = NULL;
正在尝试将值NULL
(类型为void *
的空指针常量)分配给*headNode
指定的对象,即struct node
。您无法将指针值分配给结构类型的对象,这是错误告诉您的内容。
你可以将NULL
分配给headNode
本身......
headNode = NULL;
...实际上另一个答案是观察到的,但是虽然编译器会接受它,但它不会产生你所效应的效果,因为headNode
函数参数是函数的本地参数。它的值始终是其参数的(指针)值的副本,对本地副本的更改不会影响调用者的原始参数。
如果您希望更改来电者的副本,那么您有两个主要选择:
返回修改后的值(NULL
)并让调用者将其分配给原始变量(如果愿意),或者
不是传递头指针本身,而是传递指向包含头指针(类型为node **
)的变量的指针。
这两种选择都需要改变来电者;后者还需要进一步改变功能实施。
答案 2 :(得分:0)
clear
函数过于复杂和错误。它没有释放最后一个元素。
这是正确的:
void clear(node* headNode) {
node* nextNode;
while (headNode != NULL) {
nextNode = headNode->next;
free(headNode);
headNode = nextNode;
}
}
如果您希望clear
函数将其参数设置为NULL
:
你需要这个:
void clear(node** headNode) {
node* nextNode;
while (*headNode != NULL) {
nextNode = (*headNode)->next;
free(*headNode);
*headNode = nextNode;
}
*headNode = NULL;
}
并像这样称呼它
clear(&list);
// now list is NULL
答案 3 :(得分:0)
这一行('*'删除后)没有任何作用,因为它只更改了本地headNode参数(100%将被编译器完全删除)
headNode = NULL;
如果要为更高级别的指针指定NULL,则需要将节点** headnode传递给此函数或使其成为节点*:。 1。
void clear(node** headNode){
node* nextNode;
if (*headNode == NULL) return;
while (*headNode -> next != NULL){
nextNode = *headNode -> next;
free(*headNode);
*headNode = nextNode;
}
*headNode = NULL;
}
和电话
clear(&list);
或更好
node *clear(node* headNode){
node* nextNode;
if (headNode == NULL) return;
while (headNode -> next != NULL){
nextNode = headNode -> next;
free(headNode);
headNode = nextNode;
}
return NULL;
}
和电话:
list = clear(list);