我尝试使用addToFront函数来实现链接列表。 在这里,我只是将数字 5 添加到列表的前面。我知道如果列表为空,列表指针应为Null,但是,情况似乎并非如此。
编辑文件: 我编辑了文件(感谢taskinoor的答案),现在提供
的输出0 5
而不是
5
我有头文件:
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
typedef struct List {
struct list * next;
int value;
int size;
}list;
void addToFront(int num, list **l);
void printList(list * l);
int getSize(list * l);
void initialize(list * l);
void freeList(list *l);
一个c文件&#34; main.c&#34;
#include "Header.h"
int main() {
list l;
initialize(&l);
addToFront(5, &l);
printList(&l);
_getch();
freeList(&l);
return 0;
}
void printList(list * l) {
list *current = l;
while (current != NULL) {
printf("%d ", current->value);
current = current->next;
}
}
void freeList(list *l) {
list *current = l;
while (current != NULL) {
list *tmp = current;
current = current->next;
free(tmp);
}
}
接口c文件(不完整)
#include "Header.h"
int getSize(list * l) {
return l->size;
}
void initialize(list * l) {
l->next = NULL;
l->value = 0;
l->size = 0;
}
// need to pass **l to update it
void addToFront(int num, list **l) {
// allocate memory for new node
list *tmp = (list *)malloc(sizeof(list));
tmp->value = num;
// new node should point to whatever head is currently pointing
// even if head is NULL at beginning
tmp->next = *l;
// finally l needs to point to new node
// thus new node becomes the first node
*l = tmp;
}
但是,当调用addToFront函数时,永远不会执行if语句。哪个没有意义,如果列表为空,列表指针不应为空?
接下来,我尝试在l == NULL
中手动设置Initialize function
,但这也没有做任何事情。另外,我的print函数循环无穷大,我认为这是malloc的一个问题。任何帮助将不胜感激。
答案 0 :(得分:1)
好的,让我们从最后一部分开始:
我试图在Initialize函数中手动设置l == NULL,但是它没有做任何事情
实际上它做了一些事情,但是一旦你从initialize函数返回,那个改变就丢失了。这就是原因:
当你说初始化(l)时,在初始化函数体中你得到原始指针l的复制。然后你做那个指针,指向NULL。当该函数返回原始指针时,l仍然指向初始内存(使用malloc分配的内存)。如果您确实希望此初始化函数具有此类行为,则应将其更改为:
initalize(list **l)
关于addToFront()函数,实际上如果它被执行了,你会得到一个段错误!你检查一下:
if (l == null)
如果是,则尝试取消引用NULL指针!
l->value = num;
l->next = NULL;
l->size++;
最后,在您的打印功能中,您不会前进指针。你应该写点像
l=l->next
为了工作
答案 1 :(得分:1)
if (l == NULL)
中的条件addToFront
不正确,因为此处l
为非空。您已在l = malloc(sizeof(list));
的开头调用main
,这使l
不为NULL。无需malloc
并以这种方式初始化l
。我想通过l
你的意思是指向列表的头指针。这应该在开始时为NULL(即不要在malloc
调用main
并将返回的地址分配给l
),并且应该在addToFront
中分配节点的内存,就像这样:
// need to pass **l to update it
void addToFront(int num, list **l) {
// allocate memory for new node
list *tmp = (list *) malloc(sizeof(list));
tmp->value = num;
// new node should point to whatever head is currently pointing
// even if head is NULL at beginning
tmp->next = *l;
// finally l needs to point to new node
// thus new node becomes the first node
*l = tmp;
}
从malloc
删除main
。
int main() {
list *l;
addToFront(5, &l); // pass address of l
printList(l);
// other stuffs
}
打印将是这样的:
void printList(list * l) {
list *current = l;
while (current != NULL) {
printf("%d ", current->value);
current = current->next;
}
}
最后仅仅免费l
是不够的。您需要遍历整个列表并释放其中的每个节点。
void freeList(list *l) {
list *current = l;
while (current != NULL) {
list *tmp = current;
current = current->next;
free(tmp);
}
}
答案 2 :(得分:0)
这是因为您的打印功能。 您只打印后面有下一个节点的值。所以只有1个值不会打印任何东西。相反,你应该:
void printList(list * l) {
while (l !=NULL)
{
printf("%d ", l->value);
l=l->next;
}
}
同样在你的addToFront
函数中,你有一个逻辑错误,你只是设置数据和大小,如果传入的列表实际上是NULL
,情况并非如此。
答案 3 :(得分:0)
使用:
void addToFront(int num, list **l) {
list *tmp= malloc(sizeof(list));
tmp->value = num;
tmp->next = *l;
*l= tmp;
}
注意:不需要initialize
。只需传递一个空的或非空的列表,main
就可以了:
int main()
{
list * l= NULL;
addToFront(5, &l);
...
请参阅 ForeverStudent 他的解决方案来修复打印错误。