使用函数反转链接列表

时间:2017-04-23 20:26:47

标签: c linked-list

我试图通过将头节点传递给函数来反转并打印链表。然后我必须用“打印输出”功能打印反转列表。打印输出不是一个问题,但逆转正在困扰我。我尝试运行代码时只打印两次列表

#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;

}

我试图创建三个新节点来帮助我在这里处理指针。 希望这不是一个糟糕的问题,我感谢任何帮助。请注意,“打印输出”已注释掉,如果您希望自己测试此代码,则需要取消注释。我顺便使用代码块。再次感谢。

1 个答案:

答案 0 :(得分:1)

主要问题是reverse还必须将指针交换到列表的头部。但是,使用函数void reverse(Nodeptr head),您可以按值传递头指针,从而无法以调用者受影响的方式更改它。

我建议将签名更改为

Nodeptr reverse(Nodeptr head);

并改变对

的调用
head = reverse(head);

也可能存在其他问题;但这可能是进一步分析的起点。