实验2.3 双链表实现成绩管理——基础操作的实现

来源:互联网 发布:淘宝logo设计哪家好 编辑:程序博客网 时间:2024/06/06 00:06

一.实验目的

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

 

.实验内容

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



三.源代码

#include <iostream>  using namespace std;    template <class DataType>  struct Node  {      DataType data;     Node<DataType> *prior,*next;  };  template <class DataType>  class LinkList  {  public:      LinkList();       LinkList(DataType a[], int n);      ~LinkList();      int Length();      DataType Get(int i);      int Locate(DataType x);      void Insert(DataType x, int i);      DataType Delete(int i);      void PrintList();    private:     Node<DataType> * first;  };    template <class DataType>  void LinkList<DataType> ::PrintList()  {        Node<DataType>*p=NULL;      p = first->next;  //工作指针P初始化      cout << "【 ";      while (p != NULL)      {             cout << p->data<<" ";          p = p->next;      }      cout << "】"<<endl;  }    template <class DataType>  int LinkList<DataType>::Length()  {        Node<DataType>*p = NULL;      p = first->next;      int count = 0;      while (p != NULL)      {          p = p->next;          count++;      }      return count;  }  template <class DataType>  DataType LinkList<DataType>::Get(int i)  {         Node<DataType>*p = NULL;      p = first->next;      int count = 1;      while (p!=NULL&&count<i)      {          p = p->next;          count++;      }      if (p == NULL) throw"位置";      else      {          return p->data;      }  }    template <class DataType>  int LinkList<DataType>::Locate(DataType x)  {         Node<DataType>*p = NULL;      p = first->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>::Insert(DataType x, int i)  {         Node<DataType>*p,*s;      p = first;      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->prior =p;      s->next = p->next;        p->next->prior=s;          p->next = s;     }   }    template <class DataType>  LinkList <DataType>::LinkList()  {      first = new DulNode<DataType>;      first->next = NULL;  }      template <class DataType>  LinkList<DataType>::LinkList(DataType a[], int n)   {         Node<DataType> *s, *r;      first = new Node<DataType>;             r = first;      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>  DataType LinkList<DataType>::Delete(int i)  {     Node<DataType> *p,*q;    int x;      p=first;          p = first;            while (i-- > 1)             p= p->next;          if(p==NULL||p->next==NULL) throw"位置";          else{          q = p->next;          x=q->data;          if (p->next != NULL){              if(q->next!=NULL)          q->next->prior = p;                else{          p->next=NULL;          p->next = q->next;          delete q;          q = NULL;          return x;          }      }           p->next = q->next;           delete q;           q = NULL;          return x;        }}  template <class DataType>  LinkList <DataType>::~LinkList()  {         Node<DataType>*q = NULL;      while (first != NULL)      {             q = first;          first = first->next;          delete q;         }      cout << "链表已成功删除。" <<endl;  }    int main()  {         int num;      cout << "请输入学生人数:";      cin >> num;        int studemo[] = { 50,68,70,80,90,78,88,49 };      LinkList<int> demo(studemo, num);      demo.PrintList(); //展示学生成绩      cout << "--------------------" << endl;      cout << "查找位置为三的学生成绩:" << demo.Get(3) << endl;      cout << "--------------------" << endl;      cout << "查找成绩为80的学生的位置:" << demo.Locate(80) << endl;      cout << "--------------------" << endl;      cout << "在第四与第五之间插入成绩85:"<<endl;      cout << "结果为:";      demo.Insert(85, 5);      demo.PrintList();      cout << "--------------------" << endl;      cout << "链表总长为:";      cout << demo.Length() << endl;      cout << "--------------------" << endl;      cout << "删除第3位成绩:";      cout << demo.Delete(3)<<endl;      cout << "结果为:";      demo.PrintList();      cout << "--------------------" << endl;      cout << "析构链表"<<endl;      demo.~LinkList();          return 0;  }  

.结果截图

五、实验心得

1、 双链表是一种对称结构,使得在结点P的之前之后执行插入和删除操作都相对容易;

2、双链表基本操作与单链表相同,不同的有插入与删除;

3、虽然是最基本的功能实现,我依旧在运行中出现了比较繁琐的问题,如指针的使用,结点的运用等,查阅书籍后仍然有很多不了解的地方,之后通过网络去寻找问题所在,去了解其知识点,才明白该如何应用,了解到实践让知识更加巩固

4、本双链表是由前一单链表修改而成,但是在修改过程后,即使没有出现error,但是在执行删除功能时一直出现自我终止的结果,进行独自修改很久,依旧不能解决问题,最后询问了同学,发现有同学出现过相同的问题,向他讨教询问,发现问题所在,最后才能完整得实现功能。

阅读全文
0 0
原创粉丝点击