双链表的基本使用及其应用(实验2.2)
来源:互联网 发布:linux的常用命令 编辑:程序博客网 时间:2024/06/06 13:57
一.实验目的
巩固双链表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
二. 实验内容
建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。用双链表链表来实现,分别输出结果。
为了以后的对代码的修改、优化和复用,这里采用了C++中的模板来实现,下面是模板的实现。
DoubleLinkList.h
#ifndef DoubleLinkList_h#define DoubleLinkList_h#include<iostream>using namespace std;template<class DataType>struct Node{ DataType data; Node<DataType> *next; Node<DataType> *prior;};template<class DataType>class DoubleLinkList{private: Node<DataType> *head; Node<DataType> *tail; int length;public: // 构造函数 DoubleLinkList(int length); // 正向遍历 void traverseList(); // 反向遍历 void traverseListReturn(); // 排序列表 void sortList(); // 插入操作 bool insert(int index, DataType x); // 修改链表中指定位置的节点 bool ChangeList(int postion, int num); // 删除特定位置 DataType DeleteList(int postion); // 按位查找 DataType GetList(int postion); // 析构函数 ~DoubleLinkList() {};};#endif /* DoubleLinkList_h */
DoubleLinkList.cpp
#include "DoubleLinkList.h"template<class DataType>DoubleLinkList<DataType>::DoubleLinkList(int length){ this -> length = length; head = new Node<DataType>; head -> prior = NULL; tail = head; for (int i = 0; i < length; i++) { Node<DataType> *temp = new Node<DataType>; cout << "Please enter the no." << i + 1 << ":Node's data:"; cin >> temp -> data; temp -> next = NULL; temp -> prior = tail; tail -> next = temp; tail = temp; }}template<class DataType>void DoubleLinkList<DataType>::traverseList(){ Node<DataType> *p = head -> next; while (p != NULL) { cout << p -> data << " "; p = p -> next; } cout << endl;}template<class DataType>void DoubleLinkList<DataType>::traverseListReturn(){ Node<DataType> *p = tail; while (p -> prior != NULL) { cout << p -> data << " "; p = p -> prior; } cout << endl;}template<class DataType>void DoubleLinkList<DataType>::sortList(){ Node<DataType> *p = new Node<DataType>; Node<DataType> *q = new Node<DataType>; DataType temp; for (p = head -> next; p -> next != NULL; p = p -> next) { for (q = p -> next; q != NULL; q = q -> next) { if (q -> data < p -> data) { temp = q -> data; q -> data = p -> data; p -> data = temp; } } }}template<class DataType>bool DoubleLinkList<DataType>::insert(int index, DataType x){ if (index < 1 || index > length) { return false; } Node<DataType> *p = new Node<DataType>; p -> data = x; Node<DataType> *q = head; for (int i = 0; i < index; i++) { q = q -> next; } p -> prior = q -> prior; q -> prior -> next = p; p -> next = q; q -> prior = p; length++; return true;}template<class DataType>bool DoubleLinkList<DataType>::ChangeList(int postion, int num){ Node<DataType> *p = head -> next; if (postion > length || postion < 1) { return false; } for (int i = 0; i < postion - 1; i++) { p = p -> next; } p -> data = num; return true;}template<class DataType>DataType DoubleLinkList<DataType>::DeleteList(int postion){ Node<DataType> *p = head -> next; if (postion > length || postion < 1) { return -1; } for (int i = 0; i < postion - 1; i++) { p = p -> next; } p -> prior -> next = p -> next; p -> next -> prior = p -> prior; Node<DataType> *d = p; delete p; length--; return d -> data;}template<class DataType>DataType DoubleLinkList<DataType>::GetList(int postion){ Node<DataType> *p = head -> next; if (postion > length || postion < 1) { return -1; } for (int i = 0; i < postion - 1; i++) { p = p -> next; } return p -> data;}
以上模板实现了双链表的基本结构,可以实现对数据的插入、删除、查找等基本功能。下面是用模板的应用~
main.cpp
#include <iostream>#include "DoubleLinkList.cpp"using namespace std;int main(int argc, const char * argv[]) { DoubleLinkList<float> list(5); cout << "正向遍历成绩表" << endl; list.traverseList(); cout << "反向遍历成绩表" << endl; list.traverseListReturn(); cout << "在4号位置插入分数 95" << endl; list.insert(4, 95); cout << "正向遍历成绩表" << endl; list.traverseList(); cout << "排序分数表" << endl; list.sortList(); cout << "正向遍历成绩表" << endl; list.traverseList(); cout << "反向遍历成绩表" << endl; list.traverseListReturn(); cout << "将第3个位置的分数改为 100" << endl; list.ChangeList(3, 100); cout << "正向遍历成绩表" << endl; list.traverseList(); cout << "读取第五个位置的分数为:"; cout << list.GetList(5) << endl; cout << "删除第三个位置的分数" << endl; list.DeleteList(3); cout << "正向遍历成绩表" << endl; list.traverseList(); return 0;}
运行结果如下:
三. 总结和心得
上面的代码实现了实验所要求的对学生成绩表的基本操作功能,也使用了双链表来实现。在程序设计时双链表比单链表写起来难度增加了,也复杂了一点。
双链表中很多功能和之前的写的单链表的功能差不多,写起来并没有什么困难。双链表比单链表复杂是它用了两个指针,一个指向前一个人,另一个指向后一个,使它可以正向反向遍历。在操作指针的时候,也需要注意它的操作顺序。我在写那时不时都会有点乱,需要再巩固一下。最近都在写swift的demo,在swift中程序员不需要去考虑’*’号的问题。在习惯了objective-c和swift的语法后,敲回C++还是一时有点转不过来,需要多加练习。
简书传送门:http://www.jianshu.com/u/1bed5943be92
阅读全文
0 0
- 双链表的基本使用及其应用(实验2.2)
- 双链表的基本使用及其应用(实验2.2)
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 顺序表的基本操作实现及其应用(实验1)
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- MySQL 错误码: 1093 You can't specify target table 'jc_user' for update in FROM clause
- Android消息机制,从Java层到Native层剖析
- 初学http整理笔记 post方法请求,将路径拼接方法
- Java SE——运算符
- poj 2135 Farm Tour
- 双链表的基本使用及其应用(实验2.2)
- java实现直接插入排序
- git安装与配置
- C语言编程
- webview加载步骤
- 简单的用C语言编写的《黑客帝国》装逼程序
- 深度学习--手写数字识别<一>
- javascript实现list
- 模线性方程组