单链表的基本操作及其应用(实验2.1)

来源:互联网 发布:网络用语pt是什么意思 编辑:程序博客网 时间:2024/05/16 12:25

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

二. 实验内容
建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。用单链表来实现,分别输出结果。
为了以后的对代码的修改、优化和复用,这里采用了C++中的模板来实现,下面是模板的实现。

SingleLinkList.h

#ifndef SingleLinkList_h#define SingleLinkList_h#include <iostream>using namespace std;template<class DataType>struct Node {    DataType data;    Node<DataType> *next;};template<class DataType>class SingleLinkList {public:    // 无参构造函数,建立只有头结点的空链表    SingleLinkList();    // 有参构造函数,建立有n个元素的单链表    SingleLinkList(DataType a[], int n);    // 析构函数    ~SingleLinkList() {};    // 求单链表长度    int Length();    // 按位查找    DataType Get(int i);    // 按值查找    int Locate(DataType x);    // 插入操作    void Insert(int i, DataType x);    // 删除操作    DataType Delete(int i);    // 遍历操作    void PrintList();private:    // 头指针    Node<DataType> *first;};#endif /* SingleLinkList_h */

SingleLinkList.cpp

#include "SingleLinkList.h"template<class DataType>SingleLinkList<DataType>::SingleLinkList(){    first = new Node<DataType>;    first->next = NULL;}template<class DataType>// 尾插法SingleLinkList<DataType>::SingleLinkList(DataType a[], int n){    Node<DataType> *r, *s;    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;                     //将结点s插入到终端结点之后    }    r -> next = NULL;              //单链表建立完毕,将终端结点的指针域置空}template<class DataType>int SingleLinkList<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 SingleLinkList<DataType>::Get(int i){    Node<DataType> *p = first -> next;    for (int count = 0; count < i; count++)    {        count++;        p = p -> next;    }    if (p == NULL)        throw("位置错误");    else        return p -> data;}template<class DataType>int SingleLinkList<DataType>::Locate(DataType x){    Node<DataType> *p;    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 SingleLinkList<DataType>::Insert(int i, DataType x){    Node<DataType> *p = first;    for (int k = 1; k <= i - 1; k++)    {        p = p -> next;    }    Node<DataType> *tempNode ;    tempNode = new Node<DataType>;    tempNode -> data = x;    tempNode -> next = p -> next;    p -> next = tempNode;}template<class DataType>DataType SingleLinkList<DataType>::Delete(int i){    DataType x;    Node<DataType> *p;    p = first;    for (int k = 1; k < i; k++)    {        p = p -> next;    }    Node<DataType> *tempNode;    tempNode = new Node<DataType>;    tempNode = p -> next;    x = tempNode -> data;    p -> next= tempNode -> next;    delete tempNode;    return x;}template<class DataType>void SingleLinkList<DataType>::PrintList(){    Node<DataType> *p = NULL;    p = first -> next;    while (p != NULL)    {        cout << p -> data << " ";        p = p -> next;    }    cout << endl;}

以上模板实现了单链表的基本结构,可以实现对数据的插入、删除、查找等基本功能。下面是用模板的应用~

main.cpp

#include <iostream>#include "SingleLinkList.cpp"int main(int argc, const char * argv[]) {    float score[5] = {66.5, 81.5, 80, 95.5, 100};    SingleLinkList<float> list(score, 5);    cout << "遍历学生分数" << endl;    list.PrintList();    cout << "读取第三个学生的分数" << endl;    cout << list.Get(3) << endl;    cout << "在第二个位置插入学生分数 95" << endl;    list.Insert(2, 95);    list.PrintList();    cout << "80分在分数表中的位置为: " << list.Locate(80);    cout << endl;    cout << "该分数表长度为: " << list.Length() << endl;    cout << "删除第3个分数" << endl;    list.Delete(3);    list.PrintList();    return 0;}

运行一下得到下面的输出

控制台输出

三. 总结和心得
通过上面的输出结果可以看出,用单链表已经实现了这个基本的数据操作。由于平日C++的代码敲得少,在敲代码的时候经常没转过弯来,需要多加练习。

传送门:http://www.jianshu.com/u/1bed5943be92

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