線性表之單鏈表C++實現

来源:http://www.cnblogs.com/zfc-java/archive/2017/04/03/6660470.html
-Advertisement-
Play Games

線性表之單鏈表 一、頭文件:LinkedList.h //單鏈表是用一組任意的存儲單元存放線性表的元素,這組單元可以是連續的也可以是不連續的,甚至可以是零散分佈在記憶體中的任意位置。//單鏈表頭文件#include<iostream>using namespace std;//定義單鏈表結點-結構體類 ...


    線性表之單鏈表

一、頭文件:LinkedList.h

//單鏈表是用一組任意的存儲單元存放線性表的元素,這組單元可以是連續的也可以是不連續的,甚至可以是零散分佈在記憶體中的任意位置。
//單鏈表頭文件
#include<iostream>
using namespace std;
//定義單鏈表結點-結構體類型
template<class DataType>
struct Node
{
  //數據域,存放該結點的數據
  DataType data;
  //指針域,指向下一個結點
  Node<DataType> *next;
};

template<class DataType>
class LinkedList{
public:
  //單鏈表無參構造器
  LinkedList();
  //單鏈表有參構造器
  LinkedList(DataType array[], int n);
  LinkedList(int n, DataType array[]);
  //單鏈表析構函數
  ~LinkedList();
  //獲取單鏈表的長度
  int GetLength();
  //查找單鏈表指定元素的序號
  int GetLocal(DataType x);
  //獲取單鏈表指序號的元素
  DataType GetElement(int index);
  //單鏈表中在指定位置插入指定的元素
  void Insert(int index, DataType x);
  //在單鏈表中刪除指定位置的元素
  DataType Delete(int index);
  //按序號輸出單鏈表中的元素
  void PrintLinkedList();

private :
  //聲明單鏈表的頭指針
  Node<DataType> *first;
};

//實現單鏈表的無參構造函數
template<class DataType>
LinkedList<DataType>::LinkedList()
{
  first = new Node<DataType>;
  first->next = NULL;
}

//頭插法建立單鏈表
template<class DataType>
LinkedList<DataType>::LinkedList(int n,DataType array[])
{
  //初始化一個空鏈表
  first = new Node<DataType>;
  first->next = NULL;
  for (int i = 0; i < n; i++)
  {
    //為每一個數組元素都申請新結點
    Node<DataType> *s = new Node<DataType>;
    //數組元素賦值給結點數據域
    s->data = array[i];
    //將結點插入到頭結點之前
    s->next = first->next;
    first->next = s;

  }
}

//尾插法建立單鏈表
template<class DataType>
LinkedList<DataType>::LinkedList(DataType array[], int n)
{
  //生成頭結點
  first = new Node<DataType>;
  //定義尾結點
  Node<DataType> *r = first;
  for (int i = 0; i < n; i++)
  {
    //為每一個數組元素申請一個結點
    Node<DataType> *s = new Node<DataType>;
    //把數組元素賦值給結點的數據域
    s->data = array[i];
    //將每一個結點追加到終端結點之後
    r->next = s;
    r = s;
  }
  //尾結點尾NULL
  r->next = NULL;
}

//實現單鏈表的析構函數
template<class DataType>
LinkedList<DataType>::~LinkedList()
{
  //聲明工作指針
  Node<DataType> *q;
  while (first != NULL)
  {
    //暫存被釋放的結點
    q = first;
    //讓頭指針指向要釋放結點的下一個結點
    first = first->next;
    delete q;
  }
}

//實現單鏈表插入:在指定的位置插入指定的元素
template<class DataType>
void LinkedList<DataType>::Insert(int index, DataType x)
{
  //定義工作指針
  Node<DataType> *p = first->next;
  //定義計數器,初始值為0
  int count = 0;
  while (p != NULL &&count < index - 1)
  {
    //工作指針後移
    p = p->next;
    count ++;
  }
  //找到 index-1 的位置
  if (p == NULL)
  {
    throw "插入的位置有誤";
  }
  else
  {
    //申請一個新結點
    Node<DataType> *s;
    s= new Node<DataType>;
    //其數據域為 x
    s->data = x;
    //在新結點的指針域存放工作指針p的指針域
    s->next = p->next;
    //將結點s插入到p結點之後
    p->next = s;
  }
}

//實現單鏈表的按值查找,返回指定元素在單鏈表中的序號(如不存在,則返回0)
template<class DataType>
int LinkedList<DataType>::GetLocal(DataType x)
{
  //定義工作指針
  Node<DataType> *p = first->next;
  //定義計數器,初始值是1
  int count = 1;
  //查找序號所對應的位置
  while (p != NULL)
  {
    if (p->data == x)
    {
      return count;
    }
    //工作指針後移
    p = p->next;
    //計數器加1
    count++;
  }
  //如果找不到該元素,則返回0
  return 0;
}

//實現單鏈表按位查找,返回指定位置的元素
template<class DataType>
DataType LinkedList<DataType>::GetElement(int index)
{
  //定義工作指針
  Node<DataType> *p = first->next;
  //定義計數器,初始值是1
  int count = 1;
  //查找序號所對應的位置
  while (p != NULL&&count < index)
  {
    //工作指針後移
    p = p->next;
    //計數器加1
    count++;
  }
  //如果找到單鏈表的末尾,還找不到指定的位置,則拋出異常
  if (p == NULL)
  {
    throw "查找的位置有誤";
  }
  else
  {
    //當找到合適的位置時,返回該位置上的元素
    return p->data;
  }

}

//實現獲取單鏈表的長度
template<class DataType>
int LinkedList<DataType>::GetLength()
{
  //定義計數器,用來計算單鏈表的長度
  int count = 0;
  //定義工作指針
  Node<DataType> *p = first->next;
  while (p != NULL)
  {
    p = p->next;
    count++;
  }
  return count;

}

//實現單鏈表的按序號輸出元素
template<class DataType>
void LinkedList<DataType>::PrintLinkedList()
{
  //聲明工作指針
  Node<DataType> *p;
  //初始化工作指針
  p = first->next;
  while(p != NULL)
  {
    cout << p->data << " ";
    //工作指針向後移動
    p = p->next;
  }
  cout << endl;
}

//實現單鏈表的刪除
template<class DataType>
DataType LinkedList<DataType>::Delete(int index)
{
  Node<DataType> *p = first->next;
  int count = 0;
  //查找第 index-1 位置結點
  while (p != NULL&&count < index - 1)
  {
    p = p->next;
    count++;
  }
  //如果能找到
  if (p == NULL || p->next == NULL)
  {
    throw "刪除的位置有誤";
  }
  else
  {
    Node<DataType> *q = p->next;
    DataType x = q->data;
    p->next = q->next;
    delete q;
    return x;
  }
}

 二、測試線性表之單鏈表的源文件:TestLinkedList.cpp

 

#include<iostream>
#include "LinkedList.h"
using namespace std;
void show()
{
  cout << "---------------------------------------" << endl;
}
int main()
{
  int array[] = { 1, 3, 5, 2, 7, 6, 9, 8, 10, 4};
  //聲明單鏈表
  LinkedList<int> linkedList = LinkedList<int>(10,array);
  cout << "輸出單鏈表:" << endl;
  linkedList.PrintLinkedList();
  show();
  cout << "單鏈表的長度:" << linkedList.GetLength() << endl;
  cout << "單鏈表中第5個元素是:" << linkedList.GetElement(5) << endl;
  cout << "單鏈表中元素5的位置是:" << linkedList.GetLocal(5) << endl;
  show();
  cout << "在單鏈表的第5個位置上插入元素22" << endl;
  linkedList.Insert(5, 22);
  cout << "輸出單鏈表:" << endl;
  linkedList.PrintLinkedList();
  cout << "單鏈表的長度:" << linkedList.GetLength() << endl;
  show();
  cout << "刪除第5位置的元素" << endl;
  linkedList.Delete(5);
  cout << "輸出單鏈表:" << endl;
  linkedList.PrintLinkedList();
  cout << "單鏈表的長度:" << linkedList.GetLength() << endl;
  show();
  return 0;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 二進位日誌簡單介紹 MySQL的二進位日誌(binary log)是一個二進位文件,主要用於記錄修改數據或有可能引起數據變更的MySQL語句。二進位日誌(binary log)中記錄了對MySQL資料庫執行更改的所有操作,並且記錄了語句發生時間、執行時長、操作數據等其它額外信息,但是它不記錄SELE... ...
  • 一.索引的作用 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,所以查詢語句的優化顯然是重中之重。 在數據量和訪問量不大的情況下,mysql訪問是非常快的,是否加索引對訪問影響不大。但是當數據量和訪問量劇增 ...
  • 本文來源於轉載:http://www.cnblogs.com/zhangq723/archive/2012/03/13/2394102.html 前提:在使用下麵的備份方式之前需要確保你的Sqlserver Agent服務啟動,切設置為自動啟動。否則當你伺服器重啟了但是Agent服務沒有啟動,那麼自 ...
  • 好久沒更新博客了,上周在x64位的操作系統中安裝好了32位或64位的oracle 11g客戶端,但用SSIS或Microsoft SQL Server 2012報表生成器3.0去連接oracle 11g死活都連接不上,報各類錯誤,百度了網上給出的解決方案也沒解決,這個問題困擾了兩天,但用同事的電腦去 ...
  • 本文介紹binlog的作用以及幾個重要參數的使用方法,同時通過實驗來描述binlog內部記錄內容:row 、statement跟mixed的設置下,記錄了哪些東西,最後會簡單介紹下binlog server的搭建以及一些關於binlog使用的小Tips。 理解跟熟悉binlog相關內容,對複製原理及 ...
  • 讀書筆記,待補充完善 MySQL緩存分類 InnoDB緩衝池 InnoDB日誌文件和MyIsAM數據的操作系統緩存 MyIsAM鍵緩存 查詢緩存 無法手工配置的緩存,二進位日誌,表定義文件的操作系統緩存 其它緩存,通常不需要太多記憶體 InnoDB緩衝池 作用: 1.緩存的對象包括:數據行,索引,插入 ...
  • Converter只完成了數據類型的轉換,卻不負責輸入輸出數據的格式化工作,日期時間、貨幣等雖都以字元串形式存在,卻有不同的格式。 Spring格式化框架要解決的問題是:從格式化的數據中獲取真正的數據,綁定數據,將處理完成的數據輸出為格式化的數據。Formatter介面就是該框架最重要的介面 Con ...
  • 1. class和typename意義相同的例子 問題:在下麵的模板聲明中class和typename的區別是什麼? 答案:沒有任何區別。當聲明一個模板類型參數時,class和typename意味著相同的事情。一些程式員喜歡使用class,因為容易敲打。其他的(包括我)更加喜歡使用typename, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...