0

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

这是我现在的代码:

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 方法后。

我怎样才能做到这一点?

4

3 回答 3

1

你的问题是头部是在函数中本地声明的,当你离开函数时,你会松开它。当您再次使用该功能时,您可以从头开始创建它,等等。

因此,您需要将 head 作为参数传递给 InsertChar 函数。

此外,如果您想查看 a、ab、abc 输出,则需要将元素添加到列表的尾部,而不是像现在这样添加到头部。为了实现这一点,您要么需要为 tail 存储一个单独的指针,要么每次遍历到最后一个元素。

于 2013-11-05T00:21:52.630 回答
0

有两个问题:

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

这应该可以解决您的问题:

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");
}
于 2013-11-05T00:29:03.597 回答
0

您必须跟踪列表的头部。例如:

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
于 2013-11-05T00:43:45.727 回答