我的链表库无效

时间:2014-08-31 22:08:32

标签: c memory

我刚刚开始学习c,我想创建自己的库来使用链接列表,目前我只需要它来处理字符串,但我无法让它工作。我得到一个分段错误,我知道这可能是一个愚蠢的错误,但我找不到它,有人可以帮助我吗?

这是头文件

#ifndef LIST_H
#define LIST_H

// node structure
typedef struct _node
{
    char *data;
    struct _node *next;    
} node;

void append(node *head, char* strd);

void insert(node *head, char* strd);

void del(node *head, char* strd);

void display(node *head);

int lenght(node *head);

int search(node *head, char* strd);

void freel(node *head);  

#endif

这是.c文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

void append(node *head, char* strd)
{
    node *temp, *aux;
    temp = malloc(sizeof(node));
    temp->data = malloc(strlen(strd) + 1);
    strcpy(temp->data, strd);
    aux = head;
    while(aux->next != NULL)
        aux = aux->next;
    aux->next = temp;
    temp->next = NULL;
}

void insert(node *head, char* strd)
{
    node *temp;
    temp = malloc(sizeof(node));
    temp->data = malloc(strlen(strd) + 1);
    strcpy(temp->data, strd);
    if(head == NULL)
    {
        head = temp;
        temp->next = NULL;
    }
    else
    {
        temp->next = head;
        head = temp;
    }
}

void del(node *head, char* strd)
{
    node *temp, *aux;
    temp = head;
    while(temp != NULL)
    {
        if(strcmp(temp->data, strd) == 0)
        {
            if(head == temp)
            {
                head = temp->next;
                free(temp->data);
                free(temp);
            }
            else
            {
                aux->next = temp->next;
                free(temp->data);
                free(temp);
            }
        }
        else
        {
            aux = temp;
            temp = temp->next;
        }
    }
}

void display(node *head)
{
    node *aux;
    aux = head;
    while(aux != NULL)
    {
        printf("%s ", aux->data);
        aux = aux->next;
    }
    printf("\n");
}

int lenght(node *head)
{
    int c = 0;
    node *aux;
    aux = head;
    while(aux != NULL)
    {
        aux = aux->next;
        c++;
    }
    return c;
}

int search(node *head, char* strd)
{
    node *aux;
    aux = head;
    while(aux != NULL)
    {
        if(strcmp(aux->data, strd) == 0)
        {
            return 1;
        }
    }
    return 0;
}

void freel(node *head)
{
    node *aux, *prev;
    aux = head;
    prev = aux;
    while(aux != NULL)
    {
        aux = aux->next;
        free(prev->data);
        free(prev);
        prev = aux;
    }
}

我用它来测试库

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

int main(void)
{
    char *str = "testing";
    char *str2 = "hello";
    char name[50];
    printf("what's your name: ");
    scanf("%49s",name);
    node *head;
    head = NULL;
    insert(head, str);
    append(head, str2);
    append(head, name);
    display(head);
    freel(head);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

head始终为NULL,因为您从不为其分配任何其他内容。 insert中的分配是指具有相同名称的其他变量。