C++ 实现静态单链表的实例

C++ 实现静态单链表的实例

利用数组实现的静态单链表,与严蔚敏书实现略有不同,不另设回收空间。有任何BUG或错误,希望各位朋友多多反馈~~感激不尽

/* Author : Moyiii
 * Mail: lc09@vip.qq.com
 * 静态链表实现,仅作学习之用,当然如果
 * 你想拿去用,随你好啦。
*/ 

#include <iostream> 

using namespace std; 

#define MAX_LIST_SIZE 100 

class Node
{
public:
  int data;
  int cur;
}; 

class SLinkList
{
public:
  SLinkList();
  //和普通的线性链表区别不是很大。除了两个分配
  //和回收节点空间的函数,具体算法请参考课本或
  //网络资料
  int newNode();
  bool deleteNode(int pos);
  bool insertElem(int pos, int elem);
  bool deleteElem(int pos);
  int& getElem(int pos);
  int getLength();
  bool isEmpty();
  void print();
  void clear(); 

private:
  int head;//这个可以不要,默认等于0
  int space;
  int length;
  Node *elems;
}; 

SLinkList :: SLinkList()
{
  // 0号位置为头几点,不可以更改,初始指向自己
  // 从1~MAXLENGTH为可分配节点,最初由space管理 

  elems = new Node[MAX_LIST_SIZE];
  if(!elems)
  {
    cout << "Malloc failed!" << endl;
  } 

  head = space = length = 0; 

  for(int i = 0; i < MAX_LIST_SIZE; ++i)
  {
    elems[i].data = i;
    elems[i].cur = i + 1;
  }
  elems[MAX_LIST_SIZE - 1].cur = 0;
  elems[0].cur = 0;
  space = 1;
} 

//从space指向的备用节点链表中取下一个节点
int SLinkList :: newNode()
{
  if(space == 0)
  {
    cout << "Space is full!" << endl;
    return 0;
  } 

  int pos = space;
  space = elems[space].cur;
  elems[pos].cur = 0;
  return pos;
} 

//回收节点空间
bool SLinkList :: deleteNode(int pos)
{
  if(pos == 0)
  {
    cout << "Free space Error!" << endl;
    return false;
  }
  elems[pos].cur = space;
  space = pos;
  return true;
} 

//插入节点,思路类似,找到被删除节点的前一个节点
//然后更改指向
bool SLinkList :: insertElem(int pos, int elem)
{
  if(length == MAX_LIST_SIZE)
  {
    cout << "Space is Full" << endl;
    return false;
  } 

  if(pos < 1 || pos > length + 1)
  {
    cout << "Insert Over Bound" << endl;
    return false;
  } 

  int index = head;
  for(int i = 1; i <= pos - 1; ++i)
  {
    index = elems[index].cur;
  } 

  int node = newNode();
  if(node == 0)
  {
    cout << "Space malloc failed" << endl;
    return false;
  }
  elems[node].data = elem;
  elems[node].cur = elems[index].cur;
  elems[index].cur = node; 

  length++;
  return true;
} 

//一回事,注意把删除的节点回收给space
bool SLinkList :: deleteElem(int pos)
{
  if(pos < 1 || pos > length)
  {
    cout << "Delete Node over Bound!" << endl;
    return false;
  } 

  int index = head; 

  for(int i = 1; i <= pos - 1; ++i)
  {
    index = elems[index].cur;
  } 

  int node = elems[index].cur;
  elems[index].cur = elems[node].cur; 

  deleteNode(node); 

  length--; 

  return true;
} 

void SLinkList :: print()
{
  int index = elems[head].cur;
  while(index != 0)
  {
    cout << elems[index].data << " ";
    index = elems[index].cur;
  }
  cout << endl;
  return;
} 

int SLinkList :: getLength()
{
  return length;
} 

bool SLinkList :: isEmpty()
{
  if(length == 0)
  {
    return true;
  }
  else
  {
    return false;
  }
} 

int& SLinkList :: getElem(int pos)
{
  int index = head;
  for(int i = 1; i <= pos; ++i)
  {
    index = elems[index].cur;
  }
  return elems[index].data;
} 

void SLinkList :: clear()
{
  for(int i = 0; i < MAX_LIST_SIZE; ++i)
  {
    elems[i].data = i;
    elems[i].cur = i + 1;
  }
  elems[MAX_LIST_SIZE - 1].cur = 0;
  elems[0].cur = 0;
  space = 1;
} 

int main()
{
  //测试数据,测试插入删除空间是否溢出
  SLinkList myList; 

  for(int i = 1; i <= 105; ++i)
  {
    myList.insertElem(1,i);
  } 

  //myList.print(); 

  for(int i = 1; i <= 105; ++i)
  {
    myList.deleteElem(1);
  } 

  //myList.print(); 

  //普通测试 

  for(int i = 1; i <= 10; ++i)
  {
    myList.insertElem(1,i);
  } 

  myList.print();
  cout << "Length= " << myList.getLength() <<endl; 

  myList.deleteElem(5); 

  myList.print(); 

  cout << "Length= " << myList.getLength() <<endl; 

  cout << myList.isEmpty() << endl; 

  int &elem = myList.getElem(3); 

  elem = 99; 

  myList.print(); 

  myList.clear(); 

  myList.print(); 

  return 0;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++实现顺序表的常用操作(插入删出查找输出)

    实现顺序表的插入,删除,查找,输出操作在C语言中经常用到.下面小编给大家整理实现代码,一起看下吧 代码如下所示: #include<iostream> using namespace std; #define MAXSIZE 15 typedef int DataType; typedef struct { DataType data[MAXSIZE]; //通常用一位数组来描述顺序表的数据存储 int SeqLength; /*线性表长度*/ } SeqList; SeqList *Init

  • C++实现单链表按k值重新排序的方法

    本文实例讲述了C++实现单链表按k值重新排序的方法.分享给大家供大家参考,具体如下: 题目要求: 给定一链表头节点,节点值类型是整型. 现给一整数k,根据k将链表排序为小于k,等于k,大于k的一个链表. 对某部分内的节点顺序不做要求. 算法思路分析及代码(C) 思路:将链表分为小于k.等于k.大于k的三个链表,然后再合并. 链表结点定义: typedef struct Node { int data; struct Node* next; }node, *pNode; 算法代码: pNode s

  • C++实现顺序表的方法

    废话不多说了,直接给大家上关键代码了. #pragma once #include <assert.h> template<class T> class SeqList { public: SeqList() :_a(NULL) ,_size(1) ,_capacity(1) {} SeqList(T* a, size_t size) :_a(new T[size]) ,_size(size) ,_capacity(size) { for (size_t i = 0; i <

  • 利用C++简单实现顺序表和单链表的示例代码

    本文主要给大家介绍了关于C++实现顺序表和单链表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 一.顺序表示例代码: #include <assert.h> #include <iostream> using namespace std; typedef int Datatype; class SeqList { public: SeqList() :_array(NULL) ,_size(0) ,_capacity(0) { } SeqList(const

  • C++实现单链表删除倒数第k个节点的方法

    本文实例讲述了C++实现单链表删除倒数第k个节点的方法.分享给大家供大家参考,具体如下: 题目: 删除单链表中倒数第k个节点 解题思路及算法代码: 标尺法,定义两个指针指向链表头结点,先让一个走k步,然后两个指针同时开始走,当先走的指针走到末尾时,后走的指针指向的结点就是需要删除的结点. 单链表结构定义: typedef struct Node { int data; struct Node* next; }node, *pLinkedList; 删除倒数第K结点操作代码: //head表示头结

  • C++中单链表的建立与基本操作

    准备数据 准备在链表操作中需要用到的变量及数据结构 示例代码如下: 复制代码 代码如下: struct Data   //数据结点类型 { string key;  //关键字  string name; int age;};struct CLType  //定义链表结构 { Data nodeData; Data *nextNode;}; 定义了链表数据元素的类型Data以及链表的数据结构CLType.结点的具体数据保存在一个结构Data中,而指针nextNode用来指向下一个结点. 我们可以

  • C++ 单链表的基本操作(详解)

    链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的.本文主要有单链表的创建.插入.删除节点等. 1.概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个结点的构成:元素 + 指针,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据.如下图: 2.链表的基本操作 SingleList.cpp: #include "stdafx.h" #include "SingleList.h&

  • 如何在C++中建立一个顺序表

    准备数据 复制代码 代码如下: #define MAXLEN 100 //定义顺序表的最大长度struct DATA{ char key[10]; //结点的关键字  char name[20]; int age;};struct SLType //定义顺序表结构 { DATA ListData[MAXLEN+1];//保存顺序表的结构数组 int ListLen;   //顺序表已存结点的数量 }; 定义了顺序表的最大长度MAXLEN.顺序表数据元素的类型DATA以及顺序表的数据结构SLTyp

  • 浅析C++中单链表的增、删、改、减

    首先是是一个简单的例子,单链表的建立和输出.程序1.1 复制代码 代码如下: #include<iostream>#include<string>using namespace std;struct Student{ string name; string score; Student *next;//定义了指向Candidate类型变量的指针};int main(){ int n;// cout<<"请输入学生的总数:"; cin>>n

  • C++ 实现静态单链表的实例

    C++ 实现静态单链表的实例 利用数组实现的静态单链表,与严蔚敏书实现略有不同,不另设回收空间.有任何BUG或错误,希望各位朋友多多反馈~~感激不尽 /* Author : Moyiii * Mail: lc09@vip.qq.com * 静态链表实现,仅作学习之用,当然如果 * 你想拿去用,随你好啦. */ #include <iostream> using namespace std; #define MAX_LIST_SIZE 100 class Node { public: int d

  • Java实现单链表翻转实例代码

    Java实现单链表反转,递归和非递归两种形式 /** * 反转单链表 */ /** * 定义链表 * * @author 16026 * */ class Node { int val; Node next; public Node(int val) { this.val = val; } } public class ReverseList { /** * 反转链表 * * @param head * @return */ public static Node reverseList(Node

  • 数据结构 C语言实现循环单链表的实例

    数据结构 C语言实现循环单链表的实例 实例代码: //=========杨鑫========================// //循环单链表的实现 #include <stdio.h> #include <stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data; struct Node *next; }Node,*LinkedList; int count = 0; //1.单循环

  • Go语言数据结构之单链表的实例详解

    目录 任意类型的数据域 实例01 快慢指针 实例02 反转链表 实例03 实例04 交换节点 实例05 任意类型的数据域 之前的链表定义数据域都是整型int,如果需要不同类型的数据就要用到 interface{}. 空接口 interface{} 对于描述起不到任何的作用(因为它不包含任何的method),但interface{}在需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值. 一个函数把interface{}作为参数,那么它可以接受任意类型的值作为参数:如果一个函数返回i

  • C#数据结构之单链表(LinkList)实例详解

    本文实例讲述了C#数据结构之单链表(LinkList)实现方法.分享给大家供大家参考,具体如下: 这里我们来看下"单链表(LinkList)".在上一篇<C#数据结构之顺序表(SeqList)实例详解>的最后,我们指出了:顺序表要求开辟一组连续的内存空间,而且插入/删除元素时,为了保证元素的顺序性,必须对后面的元素进行移动.如果你的应用中需要频繁对元素进行插入/删除,那么开销会很大. 而链表结构正好相反,先来看下结构: 每个元素至少具有二个属性:data和next.data

  • php实现单链表的实例代码

    复制代码 代码如下: <?php //链表节点 class node {     public $id; //节点id     public $name; //节点名称     public $next; //下一节点 public function __construct($id, $name) {         $this->id = $id;         $this->name = $name;         $this->next = null;     } } /

  • JAVA 静态的单例的实例详解

    JAVA  静态的单例的实例详解 实现代码: public class Printer { private Printer(){ } public static Printer newInstance(){ return CreatePrinter.mPrinter; } private static class CreatePrinter{ private final static Printer mPrinter = new Printer(); } } 因为静态的单例对象没有作为类的成员变

  • JAVA  静态的单例的实例详解

    JAVA  静态的单例的实例详解 实现代码: public class Printer { private Printer(){ } public static Printer newInstance(){ return CreatePrinter.mPrinter; } private static class CreatePrinter{ private final static Printer mPrinter = new Printer(); } } 因为静态的单例对象没有作为类的成员变

  • java单链表逆序用法代码示例

    本篇博客,比较简单.对单链表逆序不理解的看看就可以了. 逆序思想 现假设有一链表,有待逆序操作.我们首先想到的就是将那个指针关系逆序了就行了呗. 事实上,就是这样.博主就是以这个为目标来完成的单链表逆序操作. Node pre = null; Node post = null; while(head!=null){ post = head.next; head.next = pre; pre = head; head = post; } 这便是逆序的核心了.下面我们就来一步步的讲解. 首次逆序:

  • C语言单链表实现方法详解

    本文实例讲述了C语言单链表实现方法.分享给大家供大家参考,具体如下: slist.h #ifndef __SLIST_H__ #define __SLIST_H__ #include<cstdio> #include<malloc.h> #include<assert.h> typedef int ElemType; typedef struct Node { //定义单链表中的结点信息 ElemType data; //结点的数据域 struct Node *next

随机推荐