【问题标题】:Unable to reverse elements in doubly linked list无法反转双向链表中的元素
【发布时间】:2020-07-11 02:18:12
【问题描述】:

我正在研究双链表。元素以正常顺序完美打印。但我无法以相反的顺序显示它们。我在网上找到的一种方法是交换方法。 但我想在不交换方法的情况下打印它们。有没有其他可能的方法可以实现这一目标?

提前致谢。

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
  int data;
  struct node *next;
  struct node *prev;
}list;

list *start=NULL;
list *end=NULL;
list *create(list *);
list *display(list *);
list *reverse_display(list *);

int main()
{
  int n;

  printf("1: Create List\n");
  printf("2: Display\n");
  printf("3: Reverse Display\n");

  for(;;)
  {
    printf("Enter choice: ");
    scanf("%d",&n);

    switch(n)
    {
      case 1: start = create(start);
      break;

      case 2: start = display(start);
      break;

      case 3: start = reverse_display(start);
      break;

      default: printf("Wrong Input!!!\n");
      exit(0);
    }
  }
}

list *create(list *start)
{
  int num;
  list *new_node , *ptr;

  printf("Enter the number: ");
  scanf("%d",&num);

  new_node = (list *)malloc(sizeof(list));
  new_node->data = num;

  if(start == NULL)
  {
      new_node->prev = NULL;
      new_node->next = NULL;
      start = new_node;
  }
  else
  {
    ptr = start;
    while(ptr->next != NULL)
      ptr = ptr->next;
    ptr->next = new_node;
    new_node->prev = ptr;
    new_node->next = NULL;
  }
  return start;
}

list *display(list *start)
{
  list *ptr;
  ptr = start;
  printf("\nElements in original order:\n");
  if(start == NULL)
    printf("Empty List!!!\n");
  else
  {
    while(ptr!=NULL)
  {
    printf("%d\n",ptr->data);
    ptr=ptr->next;
  }
  }
  return start;
}

list *reverse_display(list *start)
{
  list *ptr;
  ptr = end;
  printf("\nElements in reverse order\n");
  while(ptr != start->prev)
  {
    printf("%d\n",ptr->data);
    ptr = ptr->prev;
  }
  return start;
}

【问题讨论】:

  • 您是想反转列表,还是只是以相反的顺序浏览并打印内容?
  • 只想逆序导航并打印元素。
  • 任何只是导航的函数都不需要返回任何东西。你的reverse_display 函数有什么问题?
  • OT:关于:new_node = (list *)malloc(sizeof(list)); 1) 在 C 中,返回的类型是 void*,可以分配给任何指针。强制转换只会使代码混乱。建议去掉演员表。 2) 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功,调用perror( "your error message" ); cleanup, then call exit(EXIT_FAILURE);`
  • OT:使用可变宽度字体时,2 个字符的缩进将“丢失”。建议每个缩进级别使用 4 个空格

标签: c linked-list reverse doubly-linked-list function-definition


【解决方案1】:

对于初学者这个提示

printf("1: Create List\n");

令人困惑,因为实际上列表不是在此选择中创建的,而是在列表中附加了一个新节点。我会将提示重命名为“1:将节点添加到列表\n”。

函数create不正确,因为它没有设置指针end

使用您的方法,可以通过以下方式定义函数。

list *create( list *start, list **end )
{
    int num;

    printf( "Enter the number: " );
    scanf( "%d",&num );

    list *new_node = malloc( sizeof( list ) );
    new_node->data = num;
    new_node->next = NULL;

    if ( start == NULL )
    {
        new_node->prev = NULL;
        start = *end = new_node;
    }
    else
    {
        new_node->prev = end;
        *end = ( *end )->next = new_node;
    }

    return start;
}

并且函数必须像这样调用

start = create( start, &end );

在这种情况下,函数 revrese_display 可以定义为

list * reverse_display( list *end )
{
    printf("\nElements in reverse order\n");

    if ( end != NULL )
    {
        do 
        {
            printf( "%d\n", end->data );
            if ( end->prev != NULL ) end = end->prev;
        } while ( end->prev != NULL ); 
    }

    return end; // now end is equal to start
}

虽然从函数和两个函数返回指针开始没有太大意义,但displayreverse_display 可以具有返回类型void

列表本身也应该被声明为一个单独的结构,它包含两个指向开始节点和结束节点的指针。

【讨论】:

  • end 函数的end 参数必须是list **end
猜你喜欢
  • 2013-12-16
  • 2012-06-25
  • 1970-01-01
  • 2018-03-05
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多