在 C 中反向打印链表



我正在尝试打印反向链表。但我只得到一个值。我哪里出错了?请耐心等待,因为我是C的新手。

#include<stdio.h>
#include<stdlib.h>
struct itemlist {
    int value;
    struct itemlist *next;
};
typedef struct itemlist item;
int main(void) {
    itemlist *curr,*head,*tail;
    head=NULL;
    tail=NULL;
    for (int i = 1; i < 10; i++) {
        curr=(itemlist *)malloc(sizeof(itemlist));
        curr->value=i;
        curr->next=tail;
        tail=curr;
        if (!head)
            head=curr;
    }
    curr=head;
    while (curr) {
        printf("Curr value is:%dn",curr->value);
        curr=curr->next;
    }
    return 0;
}

此代码打印 1 到 9

#include<stdio.h>
#include<stdlib.h>
struct itemlist
{
        int value;
        struct itemlist *next;
};
typedef struct itemlist item;
int main(void)
{
        itemlist *curr,*head,*prev;
        head=NULL;
        curr=NULL;
        prev=NULL;
        for(int i=1;i<10;i++)
        {
                curr = new itemlist;
                curr->value = i;
                curr->next = NULL;
                if (head == NULL)
                   head = curr;
                if(prev != NULL)
                   prev->next = curr;
                prev = curr;
        }
        curr=head;
        while(curr)
        {
                printf("Curr value is:%dn",curr->value);
                curr=curr->next;
        }
        return 0;
}

似乎你应该从尾部开始打印列表,而不是从头部开始打印。

改变

curr=head;

curr = tail;

curr=head更改为curr=tail

下面是一个简单的例子,说明了一个双向链表,它应该让你理解链表

#include<stdio.h>
#include<stdlib.h>
typedef struct
{
        int value;
        struct itemlist *next;
        struct itemlist *prev;
}itemlist;
void forward(itemlist *head)
{
    itemlist *curr = head;
    while(curr)
    {
        printf("Curr value is: %dn", curr->value);
        curr = curr->next;
    }
}
void backward(itemlist *tail)
{
    itemlist *curr = tail;
    while(curr)
    {
        printf("Curr value is: %dn", curr->value);
        curr = curr->prev;
    }
}
int main(void)
{
        itemlist *curr,*head,*tail;
        head=NULL;
        tail=NULL;
        for(int i=1;i<10;i++)
        {
                curr=(itemlist *)malloc(sizeof(itemlist));
                curr->value=i;
                curr->next = NULL;
                if(tail)
                {
                    curr->prev = tail;
                    tail->next = curr;
                }
                tail=curr;
                if(!head)
                    head=curr;
        }
        printf("Forwardsn");
        forward(head);
        printf("Backwardsn");
        backward(tail);
        return 0;
}

你根本不需要尾巴,只需要一个递归函数。该函数在printf之前自行指向下一个。

void print_reverse(Itemlist *it){
    if(it !=NULL){
        print_reverse(it->next);
        printf("Current value is:%dn",it->value);
    }
}

当您退出循环时,您的head(仅在添加第一个元素时更新一次)指向最后一个元素。

问题是,在第一次迭代中,当您分配当前项的下一个元素时:

curr->next=tail;

tail 的值为 NULL,因此列表的头部无法到达其其余部分

至少据我了解,您的计划是以相反的顺序创建一个链表,然后打印出其内容。如果是这样,您可能需要这样的东西:

#include <stdlib.h>
#include <stdio.h>
struct itemlist {
    int value;
    struct itemlist *next;
};
int main() { 
    struct itemlist *head = NULL;
    struct itemlist *pos;
    int i;
    for (i=0; i<10; i++) {
        struct itemlist *node = malloc(sizeof(*node));
        node->value = i;
        node->next = head;
        head = node;
    }
    for (pos=head; NULL != pos; pos = pos->next)
        printf("%dn", pos->value);
    return 0;
}

请注意,您不需要指向"尾巴"的指针。基本思想非常简单:从head开始作为空列表(即空指针)。通过将每个新节点的next指针设置为列表的当前开头,然后将列表的开头设置为指向新节点,在列表的开头插入每个新节点。

你很headtail混淆了:

第一个节点(节点 0):

Value = 1
next = tail = NULL;
tail = Node 0
head = Node 0 

第二个节点(节点 1):

Value = 2
next = tail = Node 0 
tail = Node 1 
head = Node 0 

现在你有

Node 1 -> Node 0 -> NULLhead = Node 0tail = Node 1

所以当你打印时,你从节点0开始("头",但它实际上是尾部)打印第一个节点然后结束

您必须切换头部和尾部以正确命名,或者开始使用tail

编辑:既然你说你想要它们,你可以这样做:

int main(void)
{
   itemlist *curr,*head,*tail;
   head=NULL;
   tail=NULL;
   for(int i=1;i<10;i++)
   {
       curr=(itemlist *)malloc(sizeof(itemlist));
       curr->value=i;
       curr->next = NULL;
       //if there is something in the list add the current node after it              
       if(tail) 
          tail->next = curr;
       //Update the tails so it's pointing to the current last node         
       tail = curr;
       //Set the head ONCE
       //this will happened the first time when if(tail) fails
       if(!head)
         head=curr;
  }
  //start at the head
  curr=head;
  while(curr)
  {
       printf("Curr value is:%dn",curr->value);
       curr=curr->next;
  }
  return 0;
}

相关内容

  • 没有找到相关文章

最新更新