我试图通过将头节点传递给函数来反转并打印链表。然后我必须用“打印输出”功能打印反转列表。打印输出不是一个问题,但逆转正在困扰我。我尝试运行代码时只打印两次列表
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int number;
struct node * next;
} Node;
typedef Node * Nodeptr;
void printout(Nodeptr);
int main()
{
int n;
Nodeptr head = NULL;
if((head = malloc(sizeof(Node))) == NULL)
return 0;
head->number = 72;
head->next = NULL;
Nodeptr here = head;
Nodeptr newnode = NULL;
for(n=0; n<100; n++)
{
if((newnode = malloc(sizeof(Node))) == NULL)
return 0;
newnode->number = rand()%50 + 50;
newnode->next = NULL;
here->next = newnode;
here = here->next;
//printf("value of cell %d contains %d\n", n, newnode->number);
}
printout(head);
//sum(head);
void reverse(head);
printout(head);
return 0;
}
void printout(Nodeptr head)
{
int i;
for(i=0; i<=100; i++)
{
if (head->next != NULL)
{
printf("value of cell %d contains %d \n",i, head->number);
head = head->next;
}
}
}
/*void sum(Nodeptr head)
{
int sum = 0;
do(sum += Nodeptr head);
while(head->next != NULL);
printf("Sum of nodes is %d \n", head->next);
}*/
void reverse(Nodeptr head)
{
Nodeptr current = head;
Nodeptr prev = NULL;
Nodeptr next = NULL;
int i;
while(current!=NULL)
{
//creating these to hold value while
//we reassign value to ptr's
next=current->next;
current->next=prev;
prev=current;
current=next;
}
head=prev;
}
正如我所提到的那样,“反向”功能给我带来了麻烦,printout成功显示了100个单元格列表,其中包含指定范围内的随机值。
void reverse(Nodeptr head)
{
Nodeptr current = head;
Nodeptr prev = NULL;
Nodeptr next = NULL;
int i;
while(current!=NULL)
{
//creating these to hold value while
//we reassign value to ptr's
next=current->next;
current->next=prev;
prev=current;
current=next;
}
head=prev;
}
我试图创建三个新节点来帮助我在这里处理指针。 希望这不是一个糟糕的问题,我感谢任何帮助。请注意,“打印输出”已注释掉,如果您希望自己测试此代码,则需要取消注释。我顺便使用代码块。再次感谢。
答案 0 :(得分:1)
主要问题是reverse
还必须将指针交换到列表的头部。但是,使用函数void reverse(Nodeptr head)
,您可以按值传递头指针,从而无法以调用者受影响的方式更改它。
我建议将签名更改为
Nodeptr reverse(Nodeptr head);
并改变对
的调用head = reverse(head);
也可能存在其他问题;但这可能是进一步分析的起点。