这是我的思路-在列表的开头和结尾各保留一个指针。将头指针向前移动,将尾指针向后移动,直到它们指向相同的位置。然后交换指针所指位置的值,并继续向前移动。当调用该函数时,会抛出分段错误。为什么会这样呢? 这是我用于列表节点的结构体:
struct dll
{
int number;
struct dll *next;
struct dll *prev;
};
这是我反转列表和主函数的功能。
int count=0;
void reverse(struct dll **root)
{
int temp;
struct dll *tail=NULL;
struct dll *temproot=NULL;
temproot =(*root);
for(;(temproot)->next !=NULL;(temproot)=(temproot)->next); //traversing to the end
tail= temproot;
while(((*root)->next != tail->prev) || ((*root)->next != tail))//one for even no. of nodes and one for odd no.of nodes
{
temp=(*root)->number; //swapping the numbers
(*root)->number=tail->number;
tail->number=temp;
(*root)=(*root)->next;
tail=tail->prev;
} //even after they are same, values need to be changed one last time
temp=(*root)->number;
(*root)->number=tail->number;
tail->number=temp;
(*root)=(*root)->next;
tail=tail->prev;
}
void insert(struct dll **root,int num)
{
struct dll *temp;
if(count==0)
{
if((*root)==NULL)
{
(*root)=(struct dll *)malloc(sizeof(struct dll));
(*root)->next=NULL;
(*root)->prev=NULL;
(*root)->number=num;
count++;
printf("\n%d",count);
}
}
else if((*root)->next==NULL)
{
temp=(struct dll *)malloc(sizeof(struct dll));
temp->next=NULL;
temp->prev=(*root);
temp->number=num;
(*root)->next=temp;
count++;
printf("\n%d",count);
}
else
{
insert(&(*root)->next,num);
}
}
main()
{
struct dll *head=NULL;
int i,n,num;
while(1)
{
printf("Enter 1 for insert, 3 for reverse, 0 for exit\n");
scanf("%d",&n);
switch(n)
{
case 1:printf("Enter number\n");
scanf("%d",&num);
insert(&head,num);
break;
case 3:reverse(&head);break;
case 0:exit(0);
default:printf("Enter correct value\n");
}
}
}
reverse
函数中更改*root
几乎肯定是错误的。按照这种写法,实际上会更改在main()
中保留的head
指针的值。在reverse
函数完成后,head
实际上将指向列表中的最后一个元素。我认为你想做的是在循环开始时将temproot = *root
赋值,并使用temproot
遍历列表。 - Tim Pierce