链表操作


#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值