使用循环将C值添加到链接列表[C]

时间:2014-03-02 05:37:46

标签: c pointers linked-list

我有一个链接列表,我正在尝试为其添加值。但我必须错误地设置我的指针,或者内存分配会发生一些事情。

我想在列表中添加令牌,但每次有新的循环时数据都会重叠。例如:

第一次:

REPL>一个 一个

第二次:

REPL> b B'/ P>

B'/ P>

注意a刚刚消失,我想在添加新值时保留以前的值。

到目前为止,这是我的代码:

struct node {
    int val;
    struct node *next;
};

struct node *head = NULL;
struct node *cur = NULL;

struct node* create_list (int value)
{
    struct node *ptr = (struct node*) malloc(sizeof (struct node));
    if (NULL == ptr) return NULL;
    ptr->val = value;
    ptr->next = NULL;

    ptr->next = head;
    head = ptr;

    return ptr;
};

struct node* insertion (int value)
{
    if (NULL == head)
        return (create_list(value));

    struct node *ptr = (struct node*)malloc(sizeof(struct node));
    ptr->val = value;
    ptr->next = NULL;

    ptr->next = head;
    head = ptr;

    return ptr;

};

void print_list(void)
{
    struct node *ptr = head;

    while(ptr != NULL) {
        printf(" %s\n",ptr->val);
        ptr = ptr->next;
    }

    return;
}

struct exp {
    int type;
    union {
        int num;
        char name;
        double decimal;
        char strq;
    } value;
};


int main(int argc, char *argv[])
{
    while(1) {
        printf("repl>");
        char *storage [30];
        char* tok;
        char g;
        char buffer[20];
        int pos = 0, i;
        fgets(buffer,sizeof(buffer),stdin);

        tok = strtok(buffer," ");

        while(tok) {
            pos++;
            storage[pos] = tok;
            create_list(storage[pos]);
            tok = strtok(NULL," ");
        }

        print_list();
    }
}

1 个答案:

答案 0 :(得分:0)

我在您的代码中看到以下问题:

  1. print_list中,如果您想将节点上的值打印为字符,则可能需要将printf(" %s\n",ptr->val);更改为printf(" %c\n",ptr->val);
  2. 我不知道为什么在使用它之前递增pos。你可能想在行create_list(storage[pos]);之后增加它。
  3. create_list的参数类型为int。您正在向其传递char *。也许你打算通过storage[pos][0]
  4. 你可能也意味着tok = strtok(tok, " ");。否则,while循环对你没有任何帮助。
  5. 在我的计算机中对代码进行了这些更改之后,程序的行为就像您预期的那样o。