IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构实验 单链表 C++实现 -> 正文阅读

[数据结构与算法]数据结构实验 单链表 C++实现

数据结构实验一(2):单链表


  1. 实验内容

    定义一个包含学生信息(学号,姓名,成绩)的单链表,使其具有如下功能(参见教材中基本操作):
    (1) 前插法或者后插法构建表;
    (2) 逐个显示学生表中所有学生的相关信息(显示表,即遍历表);
    (3) 根据姓名进行查找,返回此学生的学号和成绩(查找);
    (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩)(取值 ); 
    (5) 给定一个学生信息,插入到表中指定的位置(插入); 
    (6) 删除指定位置的学生记录(删除);
    (7) 统计表中学生个数(相当于求表长)。
    
    (1) 定义Student类,表示学生(注:注意=、==、<<、>>的重写);
    (2) 定义LinkList类,表示单链表,每一功能用一成员函数实现,函数名和参数与教材P33基本操作保持一致;
    (3)在主函数中创建LinkList对象,并对各个功能进行测试。
    (4) 程序要做到界面友好(菜单式界面),在程序运行时用户可以根据相应的提示信息进行操作。
    
  2. 单链表功能

    能正常实现各项功能,但不能保证健壮性,

    学生类:

    class Student {
    	string name;
    	int number;
    	int score;
    public:
    	string getName() {
    		return this->name;
    	}
    	Student(string _name = " ", int _number = 0, int _score = 0) {
    		this->name = _name;
    		this->number = _number;
    		this->score = _score;
    	}
    	//运算符重载
    	friend ostream& operator<<(ostream& out, const Student& s) {
    		out <<"姓名:"<< s.name << " 学号:" << s.number << " 成绩:" << s.score;
    		return out;
    	}
    	friend istream& operator>>(istream& in, Student& s) {
    		cin >> s.name >> s.number >> s.score;
    		return in;
    	}
    };
    

    链表结点类:

    //链表结点类
    class LNode {
    public:
    	Student data;//数据域
    	LNode* next;
    	LNode() {
    		this->next = NULL;
    	}
    };
    

    链表类:

    class LinkList {
    	LNode* LHead;//声明一个头指针
    public:
    	LinkList();
    	~LinkList();
    	//尾插法
    	void headInsert(string name,int number,int score);
    
    	//头插法按照位序插入
    	void headInsert(int n,Student s);
    
    	//遍历链表输出
    	void traverseList();
    
    	//删除指定位置结点
    	void deleteList(int i);
    
    	//根据姓名按值查找
    	Student locateList(string name);
    
    	//按序号查找
    	Student getList(int i);
    	//获取链表长度
    	int getLenght();
    	
    };
    

    链表初始化:

    LinkList::LinkList() {
    	this->LHead = new LNode;
    	LHead->next = NULL;  //初始化为空链表
    	if (this->LHead == NULL) {
    		cout << "分配内存失败";
    		return;
    	}
    }
    

    尾插法建立链表:

    //尾插法建立链表
    void LinkList::headInsert(string name, int number, int score) {
    	LNode* p = LHead;
    	while (p->next)
    		p = p->next;
    	LNode* q = new LNode;
    	q->data = Student(name, number, score);
    	p->next = q;
    }
    

    在指定位置使用头插法:

    //在指定位置插入
    void LinkList::headInsert(int n, Student e) {
    	if (n < 1 || n>getLenght()) {
    		cout << "插入位置错误!";
    	}
    	LNode* p;  //p指向当前扫描的点
    	int j = 0;  //p指向第几个
    	p = LHead;  //p指向头结点
    	while (p != NULL && j < n - 1) {
    		p = p->next;
    		j++;
    	}
    	if (p == NULL)
    		cout << "error";
    	LNode* s = new LNode;
    	s->data = e;
    	s->next = p->next;
    	p->next = s;
    	cout << "头插法按位置插入成功" << endl;
    }
    

    根据姓名查询:

    /根据姓名查询
    Student LinkList::locateList(string name) {
    	LNode* p = LHead->next;
    	for (int i = 0; i < getLenght(); i++) {
    		if (p && p->data.getName() != name)
    			p = p->next;
    	}
    	return p->data;
    }
    

    遍历链表:

    void LinkList::traverseList() {
    	LNode* p = LHead;
    	p = p->next;
    	if (LHead == NULL || LHead->next == NULL)
    		cout << "链表不存在或者为空!" << endl;
    	while (p)
    	{
    		cout << p->data << endl;
    		p = p->next;
    	}
    }
    

    获取长度:

    int LinkList::getLenght() {
    	int count = 0;
    	LNode* p = LHead->next;
    	while (p!=NULL)
    	{
    		count++;
    		p = p->next;
    	}
    	return count;
    }
    

    删除指定位置元素:

    void LinkList::deleteList(int i) {
    	LNode* p = LHead;
    	int j = 0;
    	if (i<0 || i>getLenght()) {
    		cout << "请输入正确的删除位置1-" << getLenght() << endl;
    	}
    	if (!(p->next))
    		cout << "链表为空" << endl;
    	while (p->next && j < i - 1) {
    		p = p->next;
    		j++;
    	}
    	LNode* q = new LNode;
    	q = p->next;
    	p->next = q->next;
    	delete q;
    	cout << "删除成功" << endl;
    }
    

    根据指定位置获取数据:

    Student LinkList::getList(int n) {
    	int j = 1;
    	LNode* p = LHead->next;
    	if (n == 0)
    		return LHead->data;
    	if (n < 1)
    		cout << "输入非法";
    	while (p && j < n) {
    		p = p->next;
    		j++;
    	}
    	return p -> data;
    }
    

    析构函数:

    LinkList::~LinkList() {
    	delete LHead;
    }
    
  3. 运行

    void show();
    int main() {
    	LinkList L;
    	show();
    	bool flag = true;
    	while (flag) {
    		int i;
    		cout << "请输入相关数字进行操作:" << endl;
    		cin >> i;
    		switch (i)
    		{
    		case 0:
    			flag = false;
    			break;
    		case 1: {
    			string name; int number; int score;
    			cout << "请依次输入姓名、学号、成绩:" << endl;
    			cin >> name >> number >> score;
    			L.headInsert(name, number, score);
    			break;
    		}
    		case 2:
    			L.traverseList();
    			break;
    		case 3:
    			int i;
    			cout << "请输入要删除的位置" << endl;
    			cin >> i;
    			L.deleteList(i);
    			break;
    		case 4:
    			int j;
    			cout << "请输入要查询的位置,1-" << L.getLenght() << ": ";
    			cin >> j;
    			cout<<L.getList(j)<<endl;
    			break;
    		case 5: {
    			string name;
    			cout << "请输入要查找的姓名: ";
    			cin >> name;
    			cout << L.locateList(name) << endl;
    			break;
    		}
    		case 6:
    			cout<<"链表长度为:"<<L.getLenght()<<endl;
    			break;
    		case 7: {
    			int i;
    			Student e;
    			cout << "请输入要插入的位置:";
    			cin >> i;
    			cout << "请输入姓名、学号、成绩:" << endl;
    			cin >> e;
    			L.headInsert(i, e);
    			break;
    		}
    		default:
    			cout << "输入错误!";
    			break;
    		}
    	}
    	cout << "退出程序";
    	return 0;
    }
    
    void show() {
    	cout << "输入以下数字进行相关操作:\n 1:插入数据\n 2:输出链表信息\n 3.删除指定位置信息\n 4:查找指定位置信息\n 5:输入姓名查找元素信息\n 6.获取元素个数\n 7.指定位置插入\n 0退出\n ";
    }
    
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-22 13:45:16  更:2021-08-22 13:47:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:29:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码