单链表的基本操作实现

本文介绍了如何实现单链表的基本操作,包括建立、插入、删除和查找。通过一个学生成绩的例子展示了操作过程,实验结果显示所有操作正确执行,加深了对单链表的理解。
摘要由CSDN通过智能技术生成

一.实验目的

     巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。

 

.实验内容

1.建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。



三.源代码

#ifndef LinkList_H
#define LinkList_H 


template<class DataType>
struct Node
{
DataType data;
Node<DataType>*next;
 } ;
 //以下是类LinkList的声明
 template<class DataType>
 class LinkList
 {
  public:
  LinkList();
  LinkList(DataType a[],int n);
  ~LinkList();
  int Locate(DataType x);
  void Insert(int i,DataType x);
  DataType Delete(int i);
  void PrintList();
  private:
  Node<DataType>*frist;
 };
#endif
 
 #include<iostream>
 using namespace std;


 //以下为类LinkList的成员函数定义
 template<class DataType>
 LinkList<DataType>::LinkList()
 {
  frist=new Node<DataType>;
  frist->next=NULL;
 }
 
 template<class DataType>
 LinkList<DataType>::LinkList(DataType a[],int n)
 {
  Node<DataType>*r,*s;
  frist=new Node<DataType>;
r=frist;
for(int i=0;i<n;i++)
{s=new Node<DataType>;
s->data=a[i];
r->next=s;r=s;
 } 
 r->next=NULL;
 }
 
 template<class DataType>
 LinkList<DataType>::~LinkList()
 {
  Node<DataType>*q=NULL;
  while(frist!=NULL)
  {
  q=frist;
  frist=frist->next;
  delete q;
}
  } 
  
template<class DataType>
void LinkList<DataType>::Insert(int i,DataType x)
{
Node<DataType>*p=frist,*s=NULL;
int count=0;
while(p!=NULL&&count<i-1)
{
p=p->next;
count++;
}
if(p==NULL)throw"位置";
else{
s=new Node<DataType>;s->data=x;
s->next=p->next;p->next=s;
}
 } 
   
template<class DataType>
DataType LinkList<DataType>::Delete(int i)
{
Node<DataType>*p=frist,*q=NULL;
DataType x;
int count=0;
while(p!=NULL&&count<i-1)
{
p=p->next;
count++;
}
if(p==NULL||p->next==NULL)
throw"位置";
else{
q=p->next;x=q->data;
p->next=q->next;
delete q;
return x;
}
  }  
  
  template<class DataType>
  int LinkList<DataType>::Locate(DataType x)
  {
  Node<DataType>*p=frist->next;
int count=1;
  while(p!=NULL)
  {
  if(p->data==x)return count;
  p=p->next;
  count ++;
 }
 return 0;
  }
 
 template<class DataType>
 void LinkList<DataType>::PrintList()
 {
  Node<DataType>*p=frist->next;
  while(p!=NULL)
  {
  cout<<p->data<<" ";
  p=p->next;
}
cout<<endl;
 }
 
 int main()
 {
  int r[5]={88,66,77,90,55};
  LinkList<int>L(r,5);
  cout<<"执行插入成绩操作前数据为:"<<endl;
  L.PrintList();
  try
  {
  L.Insert(2,70);
}
catch(char*s)
{
cout<<s<<endl;
}
cout<<"执行插入成绩操作后数据为:"<<endl;
L.PrintList();
cout<<"值为77的元素位置为:";
cout<<L.Locate(77)<<endl;
cout<<"执行删除第一个学生成绩操作前数据为:"<<endl;
L.PrintList();
try
{
L.Delete(1);
 } 
 catch(char*s)
 {
 cout<<s<<endl;
 }
 cout<<"执行删除成绩操作后数据为:"<<endl;
 L.PrintList(); 
 }
 




四.实验截图


如截图所示:第一次遍历为:88 66 77 90 55
在第二个位置插入学生分数70,再次遍历为:88 70 66 77 90 55

此时分数表的长度为:6

获取分数为77的位置为:4
删除第一个分数并输出为:88
再次遍历为:70 66 77 90 55
实验结果正确。


五.实验心得
通过这次实验,我对单链表的操作更加熟悉,通过实践队对书本上的知识点有了进一步地掌握。虽然在操作的过程中遇到很多问题,比如说关于中英文的标点符号的不同导致程序出错,还有就是头文件的设置等等。但是在自己查阅书本上的资料与同学的帮助下解决了问题,并且成功运行出了程序,感到很大的满足感,希望今后继续努力。


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值