链表反转

#include "stdio.h"
#define LEN sizeof(Student)
typedef struct student
{
 int num;
 float score;
 struct student *next;      
}Student,*link;

//构造链表的函数 
link creat(int n);
//打印链表的内容 
void print_link(link head);
//反转链表
link invert_link(link head); 
//释放内存空间 
void free_link(link head);

int main(){

int n;
link p;
link q;
//创建链表 
printf("please input the number of link:\n");
 scanf("%d",&n);
p=creat(n);//p相当于头指针 

//打印变化前的链表 
printf("the link befort invert is:\n");
print_link(p);

//打印变化后的链表 
printf("the link after invert is:\n");
q=invert_link(p);//q为新的头指针 
print_link(q);

//释放内存 
free_link(q);

system("pause");
return 0;
}

link creat(int n)
{
 int i;
 link head,newnode,rearnode;
 head=NULL;
 for(i=0;i<n;i++)
  {
   newnode=(link)malloc(LEN); 
   if(!newnode) return;
   printf("please initial the %dth node:\n",i+1);
   scanf("%d%f",&(newnode->num),&(newnode->score));
   if(head==NULL)
    {
     head=newnode;
     rearnode=newnode;            
    }
   else
    {
     rearnode->next=newnode;
     rearnode=newnode;                             
    }                             
  }    
rearnode->next=NULL;
return head;     
}

void print_link(link pointer)
{
while(pointer!=NULL)
  {
   printf("[%d,%f]=>",pointer->num,pointer->score); 
   pointer=pointer->next;
  } 
printf("\n");                                 
}

//最为关键的反转步骤 
link invert_link(link head)
{
link newnode,rearnode,backnode;//backnode的目的是为rearnode后移用的

//分三种情况:首节点,中间节点,尾节点
/*首节点的情况*/
newnode=head;
rearnode=head->next;
backnode=rearnode->next;

//断开前2个节点的连接
newnode->next=NULL;
rearnode->next=NULL;

//反向连接后结束 
rearnode->next=newnode;
newnode=rearnode;
rearnode=backnode;
backnode=backnode->next;

/*中间节点的情况*/
while(rearnode->next!=NULL)
 {
  rearnode->next=NULL;//1 先断开 
  rearnode->next=newnode;//2. 连接 
  //3 .移向下一个 
  newnode=rearnode;
  rearnode=backnode;
  backnode=backnode->next;                         
 }
/*末尾节点的情况*/
rearnode->next=newnode;
head=rearnode; 
return head;    
}

void free_link(link head)
{
link pointer;
while(head!=NULL)
 {
  pointer=head;
  head=head->next;
  free(pointer);
  pointer=NULL;               
 }  
printf("内存已经释放成功!\n");   
}

/*教材*/

link invert_link(link head)
{
link pointer;
link back;
link Next;

back=head;
pointer=back->next;
back->next=NULL;

Next=pointer->next;
pointer->next=back;
back=pointer;
pointer=Next;

while(pointer->next!=NULL)
{
 Next=pointer->next;
 pointer->next=back;
 back=pointer;
 pointer=Next;                         
}
pointer->next=back;
head=pointer;
return head;    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值