热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

C++实现线性表链式存储(单链)

本文实例为大家分享了C++实现线性表链式存储的具体代码,供大家参考,具体内容如下 实现的功能: 1、定义了三中传入不同参数的构造函数,用

本文实例为大家分享了C++实现线性表链式存储的具体代码,供大家参考,具体内容如下

实现的功能:

1、定义了三中传入不同参数的构造函数,用于初始化创建不同的链表;
2、能实现增、删、查等基本功能;

存在的问题:

当创建一个已知大小的空链表后,链表中的数据并不为空,见下图:

下面是代码及测试结果:

singlelinklist.h

#pragma once

#include "iostream"
#include "exception"
#include "stdlib.h"
#include "malloc.h"

using namespace std;

//结点类
template
class Node
{
public:
 T data;
 Node *next;
 Node()
 {
 this->next = NULL;
 }
 Node(T data, Node* next = NULL)
 {
 this->data = data;
 }
 ~Node() {};
};

//定义链表类
template
class SLinkList
{
public:
 Node node; //结点
 Node* head; //头指针

 SLinkList();   //创建链表
 SLinkList(int num, T elem[]);
 SLinkList(int num);
 ~SLinkList();

 int LengthSLinkList();  //表长
 void InsertNode(int i, T elem);  //插入结点
  void InsertNode(T elem);
 void DeleteNode(int i); //删除结点
 void DeleteAllNode(); //删除表
 T GetElem(int i);  //按序号查找
 int* GetNum(T elem);  //按元素查找
 void OutputList();    //输出
};

template
SLinkList::SLinkList()
{
 Node* p = new Node();
 this->head = p;
 cout <<"finish!" <
SLinkList::SLinkList(int num, T elem[])
{
 try
 {
 if(num <1)
  throw length_error("输入初始化num参数必须大于1!");
 else
 {
  Node* p = new Node();
  this->head = p;
  Node* temp = this->head;
  for (int i = 0; i next = new Node(*(elem + i)); //这里犯了一个错,就是把elem[i]直接丢进去,()里面放的是T类型初始值,实参传进来的是T* elem[],无法用下标进行访问
  temp = temp->next;
  }
  temp->next = NULL;
  cout <<"finish!" <
SLinkList::SLinkList(int num)
{
 try
 {
 if (num <1)
  throw length_error("输入初始化参数num必须大于1!");
 else
 {
  Node* p = new Node();
  this->head = p;
  Node* temp = this->head;
  for(int i = 1; i <= num; i++)
  {
  temp->next = new Node();
  temp = temp->next;
  }
  temp->next = NULL;
  cout <<"finish!" <
SLinkList::~SLinkList()
{
 this->DeleteAllNode();
}
*/


template
SLinkList::~SLinkList()
{
 Node* p = this->head;
 Node* temp = p->next;
 Node* q = NULL;
 while(temp)
 {
 q = temp;
 temp = temp->next;
 delete q;
 }
 delete p;
 delete temp;
 cout <<"finish ~SLinkList()" <
int SLinkList::LengthSLinkList()
{
 int count = 0;
 Node* p = this->head;
 Node* temp = p->next;
 while (temp)
 {
 count++;
 temp = temp->next;
 }
 return count;
}

template
void SLinkList::InsertNode(int i, T elem)
{
 try
 {
 if(i<1 || i>LengthSLinkList() + 1)
  throw out_of_range("输入的参数i值超出了链表的范围!");
 else
 {
  if (i != LengthSLinkList()+1) //1-len之间插入
  {
  Node* Elem = new Node(elem);
  Node* temp = this->head;
  for (int j = 1; j next;
  Node* p = temp->next;
  temp->next = Elem;
  Elem->next = p;
  }
  else
  InsertNode(elem); //在末尾插入
  cout <<"finish!" <
void SLinkList::InsertNode(T elem)  //末尾插入
{
 Node* Elem = new Node(elem);
 Node* temp = this->head;
 Node* p = NULL;
 while (temp)
 {
 p = temp;
 temp = temp->next;
 }
 p->next = Elem;
 Elem->next = NULL;
 cout <<"finnish!" <
void SLinkList::DeleteNode(int i)  //返回的是被删除的值
{
 try
 {
 if (i<1 || i > LengthSLinkList())
  throw out_of_range("输入的参数i值超出了链表的范围!");
 else
 {
  Node* temp = this->head;
  for (int j = 1; j next;
  Node *p = temp->next;
  temp->next = p->next;
  cout <<"finish!" <
void SLinkList::DeleteAllNode()
{
 Node* temp = this->head;
 int count = this->LengthSLinkList();
 while(count)
 {
 DeleteNode(count);
 count--;
 }
 delete temp;
 cout <<"finish!" <
T SLinkList::GetElem(int i)
{
 try
 {
 if(i<1 || i > LengthSLinkList())
  throw out_of_range("输入参数i值超出了链表的范围!");
 else
 {
  Node* temp = this->head;
  for(int j = 1; j <=i; j++)
  temp = temp->next;
  cout <<"finish!" <! " <data;
 }
 }
 catch(out_of_range e)
 {
 cout <<"info:" <
int* SLinkList::GetNum(T elem)
{
 Node* p = this->head;
 Node* temp = p->next;
 int* count = new int[LengthSLinkList()];
 int j = 0;
 for(int i = 1; i <= LengthSLinkList(); i++)  
 {
 if(temp->data == elem)
 {
  count[j] = i;
  j++;
 }
 else
  temp = temp->next;
 }
 cout <<"finish!" <
void SLinkList::OutputList()
{
 Node* p = this->head;
 Node* temp = p->next;
 cout <<"output list:" ;

 for(int i = 1; i <= LengthSLinkList(); i++)
 {
 cout <data <<"   " ;
 temp = temp->next;
 }
 cout <

main.cpp

#include "iostream"
#include "singlelinklist.h"

using namespace std;

int main()
{
 //Init:测试初始化构造函数
 //operator:测试增、删、查
 //标注行代码为异常测试,主要包括length_error和out_of_range
 //最后输出的是析构函数,下面代码行中未给出,见.h文件中的析构函数定义
 cout <<"**************************************************" <" < sqlinklist1;
 cout <<"**************************************************" <" < sqlinklist2(num, a);
 cout <<"length:" < error1(0, a);
 cout <<"**************************************************" <" < slistlink3(num1);
 cout <<"length:" < errror(0);
 cout <<"**************************************************" <" <" <" <" <" <" <

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文详细介绍了如何使用libpq库与PostgreSQL后端建立连接。通过探讨PQconnectdb()函数的工作原理及其在实际应用中的使用方法,帮助读者理解并掌握建立高效、稳定的数据库连接的关键步骤。 ... [详细]
  • SQL中UPDATE SET FROM语句的使用方法及应用场景
    本文详细介绍了SQL中UPDATE SET FROM语句的使用方法,通过具体示例展示了如何利用该语句高效地更新多表关联数据。适合数据库管理员和开发人员参考。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文详细介绍了HTML中标签的使用方法和作用。通过具体示例,解释了如何利用标签为网页中的缩写和简称提供完整解释,并探讨了其在提高可读性和搜索引擎优化方面的优势。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
author-avatar
msf6688
PHP小白,请大神 们多多关照!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有