我正在尝试打印反向链表。但我只得到一个价值。我哪里错了?因为我是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:%d\n",curr->value);
curr=curr->next;
}
return 0;
}
答案 0 :(得分:1)
好像你应该从尾巴开始打印你的清单,而不是从头开始。
更改
curr=head;
与
curr = tail;
答案 1 :(得分:1)
将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: %d\n", curr->value);
curr = curr->next;
}
}
void backward(itemlist *tail)
{
itemlist *curr = tail;
while(curr)
{
printf("Curr value is: %d\n", 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("Forwards\n");
forward(head);
printf("Backwards\n");
backward(tail);
return 0;
}
答案 2 :(得分:1)
此代码打印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:%d\n",curr->value);
curr=curr->next;
}
return 0;
}
答案 3 :(得分:1)
你根本不需要尾巴,但只需要一个递归函数。该函数在printf
之前指向下一个。
void print_reverse(Itemlist *it){
if(it !=NULL){
print_reverse(it->next);
printf("Current value is:%d\n",it->value);
}
}
答案 4 :(得分:0)
退出循环时,head
(仅更新一次,添加第一个元素时)指向最后一个元素。
答案 5 :(得分:0)
问题在于,在第一次迭代中,当您分配当前项的下一个元素时:
curr->next=tail;
tail的值为NULL,因此列表的头部无法到达其余部分
答案 6 :(得分:0)
您head
和tail
混在一起:
第一个节点(节点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
- &gt; Node 0
- &gt; NULL
和head
= Node 0
和tail
= 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:%d\n",curr->value);
curr=curr->next;
}
return 0;
}
答案 7 :(得分:0)
至少据我了解,您的计划是以相反的顺序创建链接列表,然后打印出其内容。如果是这样,你可能想要这样的东西:
#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("%d\n", pos->value);
return 0;
}
请注意,您不需要指向“tail”的指针。基本思想非常简单:以head
作为空列表开始(即空指针)。通过将其next
指针设置为列表的当前开头,然后将列表的开头设置为指向新节点,将每个新节点插入列表的开头。