#include<iostream>
using namespace std;
#define null 0
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node *next;
}node,*linklist;
void create(linklist &l)//创建一个单链表 尾插法
{
int n; //单链表长度
linklist p;//新指针
linklist r;//尾指针
l=new node;//创建头结点
l->next=null;
r=l;
cout<<"输入你的链表长度"<<endl;
cin>>n;
cout<<"请按顺序输入你的数据"<<endl;
for(int i=0;i<n;i++)
{
p=new node;//创建新结点
cin>>p->data;
p->next=null;
r->next=p;
r=p;
}
}
void invert(linklist &l)//逆置。利用头插法与尾插法添加数据的顺序不同 实现逆置
{
linklist p=l;
linklist s=new node;//新链表头结点
s->next=null;
linklist r;//新结点
while(p->next!=null)//头插法
{
r=new node;
r->data=p->next->data;
r->next=s->next;
s->next=r;
p=p->next;
}
l=s;
}
void print(linklist &l)//打印单链表
{
linklist p=l;
cout<<"链表数据为"<<endl;
while(p->next!=null)
{
cout<<p->next->data<<" ";
p=p->next;
}
cout<<endl;
}
double average(linklist &l)//计算平均值
{
linklist p=l;
int count=0,sum=0;
double s=0;
while(p->next!=null)
{
sum+=p->next->data;
p=p->next;
count++;//计数器
}
s=(double)sum/count;
return s;
}
int main()
{
linklist l;//定义一个头指针
create(l);//创建一个单链表
invert(l);//逆置
cout<<"逆置后" ;
print(l);//打印单链表
cout<<"平均值为:";
cout<<average(l)<<endl;
return 0;
}