插入链表无法正常工作

时间:2013-11-05 00:13:14

标签: c

我想为我的链表添加一个插入方法,该插入方法将插入链接列表中已有的内容(附加值)。

现在是我的代码:

struct node {
   char value;
   struct node *next;
};

typedef struct node item;

void main() {
    InsertChar('a');
    InsertChar('b');
    InsertChar('c');
}

void InsertChar(char s) {
    item *curr, *head;

    head = NULL;

    curr = (item *)malloc(sizeof(item));
    curr->value = s;
    curr->next = head;
    head = curr;

    while(curr) {
        printf("%c", curr->value);
        curr = curr->next;
    }

    printf("\n");
}

问题是在控制台中打印

a 
b
c

我需要它来打印更像

的东西
a
ab
abc

在main()中调用3个InsertChar方法。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

你的问题是在函数中本地声明了头部,当你离开函数时,它会松开它。当你再次来到这个功能时,你可以从头开始创建它等等。

所以你需要将head作为参数传递给InsertChar函数。

此外,如果要查看a,ab,abc输出,则需要在列表尾部添加元素,而不是像现在一样添加元素。为了实现这一点,你需要为tail设置一个单独的指针,或者每次都遍历到最后一个元素。

答案 1 :(得分:0)

有两个问题:

  1. 每次调用函数时都会重新定义列表。
  2. 当您访问列表的元素时,您应该从列表的头部开始
  3. 这可以解决您的问题:

    struct node {
       char value;
       struct node *next;
    };
    
    typedef struct node item;
    
    item * head = NULL; // global 
    
    void main() {
        InsertChar('a');
        InsertChar('b');
        InsertChar('c');
    }
    
    void InsertChar(char s) {
        item *curr, *temp;
    
        curr = (item *)malloc(sizeof(item));
        curr->value = s;
        curr->next = head;
        head = curr;
        temp = head;
    
        while(temp) {
            printf("%c", temp->value);
            temp = temp->next;
        }
    
        printf("\n");
    }
    

答案 2 :(得分:0)

您必须跟踪列表的头部。 E.g:

struct node {
   char value;
   struct node *next;
};

typedef struct node item;

item* head = NULL;
item* curr = NULL;

void InsertChar(char s) {

    item* c = (item *)malloc(sizeof(item));
    c->value = s;
    c->next = NULL;

    if (head)
        curr->next = c;
    else
        head = c;

    curr = c;

    for (c = head; c; c = c->next)
        printf("%c", c->value);

    printf("\n");
}

void main() {
    InsertChar('a');
    InsertChar('b');
    InsertChar('c');
}

输出:

a
ab
abc