链表的逆置
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//定义链表
typedef struct node
{
//数据域
int data;
//指针域
struct node *next;
} *linklist;
//创建节点
linklist chuangjian()
{
linklist L=(linklist)malloc(sizeof(struct node));
if(NULL==L)
{
return NULL;
}
//定义数据域为0
L->data=0;
//定义指针,防止指针为野指针
L->next=NULL;
return L;
}
//头插
linklist insert_head(linklist L,int element)
{//创建新的节点s
linklist s=chuangjian();
//判断是否有节点
if(NULL==L)
{
s->data=element;//给s赋值
L=s;//让L链表的首地址指向节点s
}
else//存在1个或者多个节点
{
s->next=L->next;
L->next=s;
s->data=L->data;
L->data=element;
}
return L;
}
//链表的逆置
linklist nizhi(linklist L)
{//1.判断链表是否为空,判断是否只有一个链表
if(NULL==L||NULL==L->next)
{
return L;
}
linklist p=L->next;
L->next=NULL;
while(p!=NULL)
{
linklist t=p;
p=p->next;
t->next=L;
L=t;
}
return L;
}
//遍历
void output(linklist L)
{
if(NULL ==L)
{
puts("ERROR");
return;
}
//2.循环
linklist p=L;
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
puts("");
}
int main(int argc, const char *argv[])
{
//定义链表为空
linklist L=NULL;
int n;//链表头表示插入数据元素的个数
int element;//插入的元素数据
printf("请输入n:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入插入元素%d:",i+1);
scanf("%d",&element);
L=insert_head(L,element);
}
//逆置、
printf("逆置");
L=nizhi(L);
output(L);
return 0;
}