0

在阅读了关于链表的here之后,我开始弄乱它,我定义了结构,插入到它,但是面对一些我不明白的东西,也许我做错了什么,但我想我需要你的建议或小启发。

这是我的代码:

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

typedef struct node item;

item printcurr(item *curr){
    printf("curr -> val %d\n",curr->val);
}

item addnode(item *curr,item *head,int num){
    curr->val=num;
    curr->next = head;
    head=curr;
}

void main() {
    item * curr, * head;
    int i,ITEMS,num;

    head = NULL;
    printf("How many items? \n");
    scanf("%d",&ITEMS);
    printf("Insert your numbers please\n");
    for(i=1;i<=ITEMS;i++) {
        curr = (item *)malloc(sizeof(item));
        scanf("%d",&num);
        addnode(curr,head,num);
    }

    while(curr) {
        printcurr(curr);
        curr = curr->next ;
    }
}

例如,我得到 ITEM 3 的数量,然后我插入 1,2,3,输出将是 3。我在这里遗漏了一些东西;我将如何打印所有列表而不仅仅是最后一个数字?

4

2 回答 2

3

问题在于 addnote()。main() 中的 head 值永远不会改变,因为只有 addnode() 中的 head 的本地版本被修改。(附带说明: addnote() 应该返回 void。)

而是使用

void addnode(item *curr, item **head, int num) {
    curr->val  = num;
    curr->next = *head;
    *head = curr;
}
...
addnode(curr, &head, num);

替代版本:

void addnode(item *curr, item *head, int num) {
    curr->val  = num;
    curr->next = *head;
}
...
addnode(curr, head, num);
head = curr;
于 2013-06-21T23:05:48.993 回答
2

让我们看看执行打印的循环:

while(curr) {

  printcurr(curr);
  curr = curr->next ;
}

请注意,这假设curr指向一个节点。你还没有告诉curr应该从哪里开始。根据您的描述,curr指向列表中的最后一个节点,因此这是唯一被打印出来的节点。您需要设置currhead.

另外,我建议将其分离为自己的功能。它将使您的代码更易于理解和维护。

于 2013-06-21T22:59:58.573 回答