#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;
}
链表反转
最新推荐文章于 2024-06-19 22:17:16 发布