ds_list不能处理3个以上的元素

时间:2018-01-14 13:30:03

标签: c

我不知道为什么我甚至不能添加第4个元素......

(即时通讯与mingw合作)

这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef struct ds_list_element {
    char value[MAX];
    struct ds_list_element *next;
}* ds_list;
int ds_list_empty(ds_list id) { // id listy
    if (id == NULL) return 1;
    else return 0;
}
ds_list ds_list_add(ds_list id, char add[MAX]) {
    ds_list temp;
    temp = (ds_list)(malloc(sizeof(ds_list)));
    strcpy(temp->value,add);
    temp->next = id;
    return temp;
}
void ds_list_print(ds_list id) {
    if (ds_list_empty(id) == 0) {
        printf("%s\n",id->value);
        ds_list_print(id->next);
    }
}
int main () {
    ds_list my_list = NULL;
    my_list = ds_list_add(my_list,"one");
    my_list = ds_list_add(my_list,"two");
    my_list = ds_list_add(my_list,"three");
    my_list = ds_list_add(my_list,"four");
    ds_list_print(my_list);
    return 0;
}

结果是:

four
three
two
 y
Press any key to continue . . .

我不知道为什么会这样。一切都应该工作正常。 我的朋友告诉我它正在开发ubuntu ......

2 个答案:

答案 0 :(得分:2)

temp = (ds_list)(malloc(sizeof(ds_list)));

将是

temp = malloc(sizeof(*temp)));

您想为struct ds_list_element而不是struct ds_list_element*分配内存。不要隐藏typedef名称后面的指针。它很少有帮助。

此外,您应该检查malloc的返回值,并且不需要进行投射。

答案 1 :(得分:0)

使用ds_list作为结构而不是指针

typedef struct ds_list_element {
    char value[MAX];
    struct ds_list_element *next;
}ds_list;

并为结构分配内存而不是指针。

工作计划:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100

typedef struct ds_list_element {
    char value[MAX];
    struct ds_list_element *next;
}ds_list;


int ds_list_empty(ds_list *id) { // id listy
    if (id == NULL) return 1;
    else return 0;
}

ds_list * ds_list_add(ds_list *id, char add[MAX]) {
    ds_list *temp;

    temp = (malloc(sizeof(ds_list)));
    strcpy(temp->value,add);
    temp->next = id;
    return temp;
}

void ds_list_print(ds_list *id) {

    if (ds_list_empty(id) == 0) {
        printf("%s\n",id->value);
        ds_list_print(id->next);
    }
}

int main () {
    ds_list *my_list = NULL;

    my_list = ds_list_add(my_list,"one");
    my_list = ds_list_add(my_list,"two");
    my_list = ds_list_add(my_list,"three");
    my_list = ds_list_add(my_list,"four");

    ds_list_print(my_list);
    return 0;
}

输出:

four
three
two
one