C 无法反转双链接列表中的元素

C 无法反转双链接列表中的元素,c,linked-list,reverse,doubly-linked-list,function-definition,C,Linked List,Reverse,Doubly Linked List,Function Definition,我正在研究双链接列表。元素按正常顺序完美打印。但我无法按相反顺序显示它们。我在网上找到的方法之一是交换方法。 但我想打印它们而不交换方法。有没有其他可能的方法,我可以做到这一点 提前谢谢 #include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node *next; struct node *prev; }list; list *start=NULL; list

我正在研究双链接列表。元素按正常顺序完美打印。但我无法按相反顺序显示它们。我在网上找到的方法之一是交换方法。 但我想打印它们而不交换方法。有没有其他可能的方法,我可以做到这一点

提前谢谢

#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;
}
#包括
#包括
类型定义结构节点
{
int数据;
结构节点*下一步;
结构节点*prev;
}名单;
list*start=NULL;
list*end=NULL;
列表*创建(列表*);
列表*显示(列表*);
列表*反向显示(列表*);
int main()
{
int n;
printf(“1:创建列表\n”);
printf(“2:Display\n”);
printf(“3:反向显示\n”);
对于(;;)
{
printf(“输入选项:”);
scanf(“%d”和“&n”);
开关(n)
{
案例1:开始=创建(开始);
打破
情况2:开始=显示(开始);
打破
情况3:启动=反向显示(启动);
打破
默认值:printf(“输入错误!!!\n”);
出口(0);
}
}
}
列表*创建(列表*开始)
{
int-num;
列表*新节点,*ptr;
printf(“输入数字:”);
scanf(“%d”和&num);
新节点=(列表*)malloc(sizeof(列表));
新建_节点->数据=num;
if(start==NULL)
{
新建_节点->上一个=NULL;
新建节点->下一步=空;
开始=新的_节点;
}
其他的
{
ptr=启动;
while(ptr->next!=NULL)
ptr=ptr->next;
ptr->next=新建_节点;
新建_节点->prev=ptr;
新建节点->下一步=空;
}
返回启动;
}
列表*显示(列表*开始)
{
列表*ptr;
ptr=启动;
printf(“\n按原始顺序排列的元素:\n”);
if(start==NULL)
printf(“空列表!!!\n”);
其他的
{
while(ptr!=NULL)
{
printf(“%d\n”,ptr->data);
ptr=ptr->next;
}
}
返回启动;
}
列表*反向显示(列表*开始)
{
列表*ptr;
ptr=结束;
printf(“\n元素顺序相反\n”);
同时(ptr!=开始->上一个)
{
printf(“%d\n”,ptr->data);
ptr=ptr->prev;
}
返回启动;
}

对于初学者,此提示

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
}
虽然从函数和两个函数返回指针起点没有太大意义,
display
reverse\u display
可能具有返回类型
void


此外,列表本身应声明为一个单独的结构,其中包含指向开始节点和结束节点的两个指针。

对于初学者,此提示符

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
}
虽然从函数和两个函数返回指针起点没有太大意义,
display
reverse\u display
可能具有返回类型
void


此外,列表本身应声明为一个单独的结构,其中包含指向开始节点和结束节点的两个指针。

是否要反转列表,或者只是按相反的顺序导航并打印内容?只想按相反的顺序导航并打印元素。任何只是导航的函数都不需要返回任何内容。您的
reverse_display
功能有什么问题吗?OT:关于:
new_node=(list*)malloc(sizeof(list))1)在C中,返回的类型是
void*
,可以分配给任何指针。强制转换只会使代码混乱。建议去掉石膏。2) 始终检查(!=NULL)返回值以确保操作成功。如果未成功,请调用
perror(“您的错误消息”);清理,然后调用退出(退出失败)`OT:使用可变宽度字体时,两个字符的缩进将“丢失”。建议每个缩进级别使用4个空格您是要反转列表,还是只需按相反顺序导航并打印内容?只需按相反顺序导航并打印元素。任何只需导航的函数都不需要返回任何内容。您的
reverse_display
功能有什么问题吗?OT:关于:
new_node=(list*)malloc(sizeof(list))1)在C中,返回的类型是
void*
,可以分配给任何指针。强制转换只会使代码混乱。建议去掉石膏。2) 始终检查(!=NULL)返回值以确保操作成功。如果未成功,请调用
perror(“您的错误消息”);清理,然后调用退出(退出失败)`OT:使用可变宽度字体时,两个字符的缩进将“丢失”。为每个缩进级别建议4个空格
end
函数的
create
参数必须是
list**end
。函数的
end
参数必须是
list**end