这是大半年前遗留的问题,今天来解决了。
代码:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
//结构体定义
struct list
{
int data;
struct list *next;
};
typedef struct list NODE;
typedef NODE *LINK;
//函数原型
void print_all(LINK ptr);
LINK reverse(LINK head);
int main()
{
LINK ptr,head;
int num,i;
ptr=(LINK)malloc(sizeof(NODE));
head=ptr;
//测试10个数据
for(i=0;i<=9;i++)
{
ptr->data=i+1;
ptr->next=(LINK)malloc(sizeof(NODE));
if(i==9)
ptr->next=NULL;
else
ptr=ptr->next;
}
//输出
ptr=head;
print_all(ptr);
//逆序单链表
head=reverse(head);
//输出
ptr=head;
print_all(ptr);
getch();
}
//打印链表
void print_all(LINK ptr)
{
int i=0;
while(ptr!=NULL)
{
printf("%d ",ptr->data);
ptr=ptr->next;
}
printf("\n");
}
//不借助辅助空间,直接逆序单链表
//练手小程序,没有考虑其健壮性和容错性,请保证结点个数大于3
LINK reverse(LINK head)//注意这个函数需要一个返回值,但没有完全明白这里传递地址的机制。问一下!
{
LINK p1=head;
LINK p2=p1->next;
LINK p3=p2->next;
p1->next=NULL;
p2->next=p1;
while(p3!=NULL)
{
p1=p2;
p2=p3;
p3=p3->next;
p2->next=p1;
}
return p2;
}
reverse函数中有个传值的问题没有完全明白,我的理解是传递一个指针后,这个指针的指向发生了变化,所以需要返回逆序后的head。如果您知道原因,请告诉小弟我,非常感谢。