添加到简单链接列表的前面

时间:2015-12-19 17:18:31

标签: c++ c algorithm data-structures linked-list

我尝试使用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的一个问题。任何帮助将不胜感激。

4 个答案:

答案 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 他的解决方案来修复打印错误。