#include <iostream>
#include <string>
using namespace std;
typedef struct Node
{
int num,score;
char name[20];
Node *next;
}Node ;
//求链表中元素的个数
int calculateLinkList(Node L)
{
Node *p;
p=&L;
int num=0;
while(p->next!=NULL)
{
num++;
p=p->next;
}
return num;
}
//打印学生信息
void List_Print(Node *L)
{
//输出学生信息
cout<<"链表中的学生信息是:"<<endl;
Node *r=L->next;
while(r)
{
cout<<r->num;
cout<<" "<<r->score<<" "<<r->name<<endl;
r=r->next;
}
}
//删除方法
void deleteLinkList(Node *L,int num )
{
if (L->next==NULL||num<=0|| num>calculateLinkList(*L))
{
cout<<"删除位置错误,不能执行操作!";
exit(0);
}
Node *p=NULL,*q=NULL;
p=L;
for(int i=1;i<num;i++)
{
p=p->next;
}
q=p->next;
p->next=q->next;
delete(q);
cout<<"成功删除第"<<num<<"个元素!"<<endl;
}
//插入方法,num指插入第几个
void Insert_Stu(Node *L, int num)
{
if(num<=0||num>calculateLinkList(*L))
{
cout<<"插入位置不正确!"<<endl;
exit(0);
}
Node *p;
p=L;
for(int i=1;i<num;i++)
{
p=p->next;
}
Node *q=new Node();
cout<<"\n请输入你要插入学生的学号,分数,姓名:"<<endl;
cin>>q->num>>q->score>>q->name;
q->next=p->next;
p->next=q;
cout<<"\n插入成功!";
}
//将链表在原表逆置
void convert_LinkList(Node *L)
{
Node *p=NULL;
Node *q=NULL;
Node *r=NULL;
if(calculateLinkList(*L)<=1)
{
cout<<"此链表不能逆置!"<<endl;
exit(0);
}
else{
p=L->next ;
q=p->next ;
}
r=q;
q=q->next;
r->next=p;
p->next=NULL;
p=r;
while(q!=NULL)
{
r=q;
q=q->next;
r->next=p;
p=r;
}
L->next=r;
}
int main()
{
Node *L=new Node();
Node *p=L;
int n;
cout<<"请输入学生数:";
cin>>n;
p->next=NULL;
for(int i=0;i<n;i++)
{
Node *Q=new Node();
cout<<"请依次输入学生的学号,分数,姓名"<<endl;
cin>>Q->num;
cin>>Q->score;
cin>>Q->name;
p->next=Q;
p=Q;
}
p->next=NULL;
List_Print(L);
int M=0;
M=calculateLinkList(*L);
cout<<"元素个数是:"<<M;
/* //插入链表
int insertLoc;
cout<<"请输入你要插入的位置!";
cin>>insertLoc;
Insert_Stu( L, insertLoc);
List_Print(L);
//删除链表中元素
int deleteNum;
cout<<"请输入要删除元素的位置:";
cin>>deleteNum;
deleteLinkList(L,deleteNum);
List_Print(L);
return 0;
*/
//链表的逆置实现
convert_LinkList(L);
cout<<"链表逆置后,"<<endl;
List_Print(L);
}