题目:给定程序中,函数fun的功能是将带有结点的单向链表逆置
代码:
#include<stdio.h>
#include<stdlib.h>
#define N 5
//定义链表
typedef struct node{
int data;
struct node *next;
}NODE;
/****************************************************************************
思路:链表逆序主要的思路在于:将需要前置的结点的next指向head->next所指的结点
***************************************************************************/
void fun(NODE *h)
{
NODE *p,*q,*r;
//判断该链表是否为空
p=h->next;
if(p==NULL)
return;
//q为p的下一个结点
q=p->next;
//p->next=NULL,即p的下一个结点设为空,
//将p与其它结点切割,方便操作,
//且head->next=p,即head头结点的下一个结点始终指向p
p->next=NULL;
//判断是否此时是否指向链表的尾部
while(q)
{
//r结点为下一次转换做准备
r=q->next;
//q为需要前置的结点,使其next指向p(p为head->next)
q->next=p;
//q前置后,q置为为头指针 (线性表中第一个元素存储位置head->next)
//此时,之前在q前面的元素都在q的后面了
p=q;
//移动到下一个需要前置的结点
q=r;
}
h->next=p;
}
//创建链表
NODE *creatlist(int a[])
{
NODE *h,*p,*q;
int i;
h=(NODE *)malloc(sizeof(NODE));
h->next=NULL;
for(i=0;i<N;i++)
{
q=(NODE *)malloc(sizeof(NODE));
q->data=a[i];
q->next=NULL;
if(h->next==NULL)
h->next=p=q;
else{
p->next=q;
p=q;
}
}
return h;
}
//输出链表
void outlist(NODE *h)
{
NODE *p;
p=h->next;
if(p==NULL)
printf("The list is NULL!\n");
else{
printf("\nHead ");
do{
printf("->%d",p->data);
p=p->next;
}while(p!=NULL);
printf("->End\n");
}
}
int main()
{
NODE *head;
int a[N]={2,3,4,5,6};
head=creatlist(a);
printf("\nThe original list:\n");
outlist(head);
fun(head);
printf("\nThe list after inverting:\n");
outlist(head);
}
运行结果: