无法反转双向链表中的元素
Unable to reverse elements in doubly linked 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;
}
对于初学者这个提示
printf("1: Create List\n");
令人困惑,因为实际上列表并未在此选择中创建,而是将新节点附加到列表中。我会将提示重命名为“1:将节点附加到 List\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
}
虽然 return 指针从函数和两个函数开始没有什么意义,但 display
和 reverse_display
可以具有 return 类型 void
.
列表本身也应该声明为一个单独的结构,它包含两个指向开始节点和结束节点的指针。
我正在研究双向链表。元素按正常顺序完美打印。但我无法以相反的顺序显示它们。我在网上找到的一种方法是交换方法。 但我想在不交换方法的情况下打印它们。还有其他可能的方法可以实现这一目标吗?
提前致谢。
#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;
}
对于初学者这个提示
printf("1: Create List\n");
令人困惑,因为实际上列表并未在此选择中创建,而是将新节点附加到列表中。我会将提示重命名为“1:将节点附加到 List\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
}
虽然 return 指针从函数和两个函数开始没有什么意义,但 display
和 reverse_display
可以具有 return 类型 void
.
列表本身也应该声明为一个单独的结构,它包含两个指向开始节点和结束节点的指针。