中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++數據結構之單鏈表如何實現

發布時間:2022-06-01 09:21:13 來源:億速云 閱讀:102 作者:iii 欄目:開發技術

這篇文章主要介紹了C++數據結構之單鏈表如何實現的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++數據結構之單鏈表如何實現文章都會有所收獲,下面我們一起來看看吧。

    一、單鏈表的定義

    線性表的鏈式存儲又稱為單鏈表,它是指通過一組任意的存儲單元來存儲線性表中的數據元素。為了建立數據元素之間的線性關系,對每個鏈表結點,除存放元素自身的信息外,還需要存放一個指向其后繼的指針。

    單鏈表中結點類型的描述如下:

    typedef struct  LNode{  // 定義單鏈表節點類型
      ElemType data;    // 數據域
      struct LNode* next; // 指針域
    };LNode, *LinkList;

    二、單鏈表的基本操作的實現

    1.初始化

    單鏈表的初始化操作就是構造一個空表。

    具體代碼:

    // 初始化單鏈表
    void InitList(LinkList &L) // 構造一個空的單鏈表L
    {
      L=new LNode;  // 生成新節點作為頭節點,用頭指針L指向頭節點
      L->next=NULL; // 頭節點的指針域置空
    }

    2.取值

    和順序表不同,在鏈表中并沒有存儲在物理相鄰的單元中。所以我們只能從鏈表的首節點出發,順著鏈域next逐個節點向下訪問。

    具體代碼:

    // 單鏈表的取值
    bool GetElem(LinkList L, int i, ElemType &e)
    {
      LinkList p=L->next;int j=1; // 初始化,p指向首元節點,計數器j初值為1
      while(p&&j<i) // 順著鏈域向后查找,直到p為空或p指向第i個元素
      {
        p=p->next;  // p指向下一個節點
        ++j;  // 計數器j相應加1
      }
      if(!p||j>i)return false;   // i值不合法
      e=p->data;  // 取第i個節點的數據域
      return true;
    }

    3.查找

    從鏈表的首元節點出發,依次將節點值和給定值e進行比較,返回查找結果。

    具體代碼:

    //單鏈表的查找
    bool LocateElem(LinkList L, LNode*& p, ElemType e)
    {
      //在單鏈表中查找第一個數據為e的結點
      p = L->next;//p指向首元結點
      while (p && p->data != e)
      {
        p = p->next;
      }
      if (p)
      {
        return true;
      }
      return false;
    }

    4.插入

    // 單鏈表的插入
    bool ListInsert(LinkList &L, int i, ElemType e)
    {
    
      LinkList p = L;
      LNode* s;
      int j = 0;
      while (p && j < i - 1)//p指向第i-1個結點
      {
        p = p->next;
        j++;
      }
      if (!p || i < 1)//i大于表長+1或小于1,插入位置不合法
      {
        return false;
      }
      s = new LNode;
      s->data = e;
      s->next = p->next;
      p->next = s;
      return true;
    }

    5.刪除

    //單鏈表的刪除
    bool ListDelete(LinkList& L, int i, ElemType& e)
    {
      //將單鏈表的第i個結點刪除
      LinkList p = L;
      LNode* q;
      int j = 0;
      while (p->next && j < i - 1)//p指向第i-1個結點
      {
        p = p->next;
        j++;
      }
      if (!(p->next) || i < 1)//i大于表長或小于1,刪除位置不合法
      {
        return false;
      }
      q = p->next;//臨時保存被刪結點的地址以備釋放
      p->next = q->next;
      e = q->data;//保存被刪結點的數據
      delete q;//釋放被刪結點的空間
      return true;
    }

    三、完整代碼

    #include<iostream>
    using namespace std;
    #define ElemType int
    
    typedef struct  LNode{  // 定義單鏈表節點類型
      ElemType data;    // 數據域
      struct LNode* next; // 指針域
    }LNode,*LinkList;
    
    
    // 初始化單鏈表
    void InitList(LinkList &L) // 構造一個空的單鏈表L
    {
      L=new LNode;  // 生成新節點作為頭節點,用頭指針L指向頭節點
      L->next=NULL; // 頭節點的指針域置空
    }
    
    
    //單鏈表的創建
    void CreateList_H(LinkList& L)//前插法創建單鏈表
    {
      //創建一個長度為n的單鏈表L,逆序位插入
      int n;
      LNode *p;
      cout << "請輸入創建的單鏈表長度:" << endl;
      cin >> n;
      for (int i = 0; i < n; i++) {
        p = new LNode;
        cout << "請輸入插入的第" << i + 1 << "個數據值" << endl;
        cin >> p->data;
        p->next = L->next;
        L->next = p;
      }
    }
    
    
    // 單鏈表的取值
    bool GetElem(LinkList L, int i, ElemType &e)
    {
      LinkList p=L->next;int j=1; // 初始化,p指向首元節點,計數器j初值為1
      while(p&&j<i) // 順著鏈域向后查找,直到p為空或p指向第i個元素
      {
        p=p->next;  // p指向下一個節點
        ++j;  // 計數器j相應加1
      }
      if(!p||j>i)return false;   // i值不合法
      e=p->data;  // 取第i個節點的數據域
      return true;
    }
    
    
    
    //單鏈表的查找
    bool LocateElem(LinkList L, LNode*& p, ElemType e)
    {
      //在單鏈表中查找第一個數據為e的結點
      p = L->next;//p指向首元結點
      while (p && p->data != e)
      {
        p = p->next;
      }
      if (p)
      {
        return true;
      }
      return false;
    }
    
    
    // 單鏈表的插入
    bool ListInsert(LinkList &L, int i, ElemType e)
    {
    
      LinkList p = L;
      LNode* s;
      int j = 0;
      while (p && j < i - 1)//p指向第i-1個結點
      {
        p = p->next;
        j++;
      }
      if (!p || i < 1)//i大于表長+1或小于1,插入位置不合法
      {
        return false;
      }
      s = new LNode;
      s->data = e;
      s->next = p->next;
      p->next = s;
      return true;
    }
    
    
    //單鏈表的刪除
    bool ListDelete(LinkList& L, int i, ElemType& e)
    {
      //將單鏈表的第i個結點刪除
      LinkList p = L;
      LNode* q;
      int j = 0;
      while (p->next && j < i - 1)//p指向第i-1個結點
      {
        p = p->next;
        j++;
      }
      if (!(p->next) || i < 1)//i大于表長或小于1,刪除位置不合法
      {
        return false;
      }
      q = p->next;//臨時保存被刪結點的地址以備釋放
      p->next = q->next;
      e = q->data;//保存被刪結點的數據
      delete q;//釋放被刪結點的空間
      return true;
    }

    四、測試一下代碼

    #include<iostream>
    using namespace std;
    #define ElemType int
    
    //************************單鏈表的存儲結構********************
    typedef struct LNode
    {
      ElemType data;//結點的數據域
      struct LNode* next;//結點的指針域
    }LNode, * LinkList;//LinkList為指向結構體LNode的指針類型
    
    //***********************單鏈表的基本操作函數******************
    
    //單鏈表的初始化
    void InitList(LinkList& L)
    {
      //構造一個空的單鏈表
      L = new LNode;
      L->next = NULL;
    }
    //單鏈表的創建
    void CreateList_H(LinkList& L)//前插法創建單鏈表
    {
      //創建一個長度為n的單鏈表L,逆序位插入
      int n;
      LNode* p;
      cout << "請輸入創建的單鏈表長度:" << endl;
      cin >> n;
      for (int i = 0; i < n; i++)
      {
        p = new LNode;
        cout << "請輸入插入的第" << i + 1 << "個數據值" << endl;
        cin >> p->data;
        p->next = L->next;
        L->next = p;
      }
    }
    
    void CreateList_R(LinkList& L)//后插法創建單鏈表
    {
      //創建一個長度為n的單鏈表L,正序位插入
      int n;
      LNode* p, * r;
      r = L;//尾指針r指向頭結點
      cout << "請輸入創建的單鏈表長度:" << endl;
      cin >> n;
      for (int i = 0; i < n; i++)
      {
        p = new LNode;
        cout << "請輸入插入的第" << i + 1 << "個數據值" << endl;
        cin >> p->data;
        p->next = NULL;
        r->next = p;
        r = p;
      }
    }
    
    //單鏈表的插入
    bool ListInsert(LinkList& L, int i, ElemType e)
    {
      //在帶頭結點的單鏈表L的第i個結點前插入新結點
      LinkList p = L;
      LNode* s;
      int j = 0;
      while (p && j < i - 1)//p指向第i-1個結點
      {
        p = p->next;
        j++;
      }
      if (!p || i < 1)//i大于表長+1或小于1,插入位置不合法
      {
        return false;
      }
      s = new LNode;
      s->data = e;
      s->next = p->next;
      p->next = s;
      return true;
    }
    
    //單鏈表的刪除
    bool ListDelete(LinkList& L, int i, ElemType& e)
    {
      //將單鏈表的第i個結點刪除
      LinkList p = L;
      LNode* q;
      int j = 0;
      while (p->next && j < i - 1)//p指向第i-1個結點
      {
        p = p->next;
        j++;
      }
      if (!(p->next) || i < 1)//i大于表長或小于1,刪除位置不合法
      {
        return false;
      }
      q = p->next;//臨時保存被刪結點的地址以備釋放
      p->next = q->next;
      e = q->data;//保存被刪結點的數據
      delete q;//釋放被刪結點的空間
      return true;
    }
    
    //單鏈表的取值
    bool GetElem(LinkList L, int i, ElemType& e)
    {
      //獲取單鏈表中第i個結點的數據
      LinkList p = L;
      int j = 0;
      while (p->next && j < i - 1)//p指向第i-1個結點
      {
        p = p->next;
        j++;
      }
      if (!(p->next) || i < 1)//i大于表長或小于1,第i個結點不存在
      {
        return false;
      }
      e = p->next->data;//獲取第i個結點的數據
      return true;
    }
    
    //單鏈表的查找
    bool LocateElem(LinkList L, LNode*& p, ElemType e)
    {
      //在單鏈表中查找第一個數據為e的結點
      p = L->next;//p指向首元結點
      while (p && p->data != e)
      {
        p = p->next;
      }
      if (p)
      {
        return true;
      }
      return false;
    }
    
    //*********************************單鏈表的基本功能函數******************************
    
    //1、插入
    void ListInsert(LinkList& L)
    {
    
      ElemType e;
      int i;
      bool flag;
      cout << "請輸入要插入的數據:" << endl;
      cin >> e;
      cout << "請輸入要插入的位置:" << endl;
      cin >> i;
      flag = ListInsert(L, i, e);
      if (flag)
        cout << "插入成功!" << endl;
      else
        cout << "位置不對,插入失敗!" << endl;
    }
    
    //2、刪除
    void ListDelete(LinkList& L)
    {
      ElemType e;
      int i;
      bool flag;
      cout << "請輸入要刪除數據的位置:" << endl;
      cin >> i;
      flag = ListDelete(L, i, e);
      if (flag)
        cout << "刪除成功,刪除的數據為:" << e << endl;
      else
        cout << "位置不對,刪除失敗!" << endl;
    }
    
    //3、取值
    void GetElem(LinkList L)
    {
      ElemType e;
      int i;
      bool flag;
      cout << "請輸入要獲取數據的位置:" << endl;
      cin >> i;
      flag = GetElem(L, i, e);
      if (flag)
        cout << "獲取的數據為:" << e << endl;
      else
        cout << "位置不對,獲取數據失敗!" << endl;
    }
    
    //4、查找
    void LocateElem(LinkList L)
    {
      ElemType e;
      LNode* p = NULL;
      bool flag;
      cout << "請輸入要查找的數據:" << endl;
      cin >> e;
      flag = LocateElem(L, p, e);
      if (flag)
        cout << "查找成功,該數據的地址為:" << p << endl;
      else
        cout << "查找失敗!" << endl;
    }
    
    //5、判空
    void ListEmpty(LinkList L)
    {
      if (L->next)
        cout << "鏈表不為空!" << endl;
      else
        cout << "鏈表為空!" << endl;
    }
    
    //6、求長
    void ListLength(LinkList L)
    {
      LinkList p = L->next;//p指向第一個結點
      int i = 0;
      while (p)//遍歷單鏈表,統計結點數
      {
        i++;
        p = p->next;
      }
      cout << "鏈表的長度為:" << i << endl;
    }
    
    //7、清空
    void ClearList(LinkList& L)
    {
      LNode* p, * q;
      p = L->next;
      while (p)//從首元結點開始,依次刪除
      {
        q = p->next;
        delete p;
        p = q;
      }
      L->next = NULL;//頭結點指針域置空
    }
    
    //8、銷毀
    void DestroyList(LinkList& L)
    {
      LNode* p;
      while (L)//從頭結點開始依次刪除
      {
        p = L;
        L = L->next;
        delete p;
      }
    }
    
    //9、打印
    void PrintList(LinkList L)
    {
      LinkList p = L->next;//p指向第一個結點
      int i = 0;
      while (p)//遍歷單鏈表
      {
        i++;
        cout << "鏈表第" << i << "個數據為:" << p->data << endl;
        p = p->next;
      }
    }
    
    //菜單
    void menu()
    {
      cout << "***************************************************************************" << endl;
      cout << "***********************************1、插入*********************************" << endl;
      cout << "***********************************2、刪除*********************************" << endl;
      cout << "***********************************3、取值*********************************" << endl;
      cout << "***********************************4、查找*********************************" << endl;
      cout << "***********************************5、判空*********************************" << endl;
      cout << "***********************************6、求長*********************************" << endl;
      cout << "***********************************7、清空*********************************" << endl;
      cout << "***********************************8、銷毀*********************************" << endl;
      cout << "***********************************9、打印*********************************" << endl;
      cout << "***********************************0、退出*********************************" << endl;
      cout << "***************************************************************************" << endl;
    }
    
    int main()
    {
      LinkList L;
      InitList(L);
      int select;
      cout << "請先創建單鏈表:1、前插法!  2、后插法!" << endl;
      cin >> select;
      switch (select)
      {
      case 1://插入
        CreateList_H(L);
        system("pause");//按任意鍵繼續
        break;
      case 2://刪除
        CreateList_R(L);
        system("pause");
        break;
      default:
        cout << "輸入有誤,創建失敗!" << endl;
        system("pause");
        break;
      }
      while (1)
      {
        system("CLS");//清屏操作
        menu();
        cout << "請輸入菜單序號:" << endl;
        cin >> select;
        switch (select)
        {
        case 1://插入
          ListInsert(L);
          system("pause");//按任意鍵繼續
          break;
        case 2://刪除
          ListDelete(L);
          system("pause");
          break;
        case 3://取值
          GetElem(L);
          system("pause");
          break;
        case 4://查找
          LocateElem(L);
          system("pause");
          break;
        case 5://判斷鏈表是否為空
          ListEmpty(L);
          system("pause");
          break;
        case 6://求單鏈表的長度
          ListLength(L);
          system("pause");
          break;
        case 7://清空
          ClearList(L);
          system("pause");
          break;
        case 8://銷毀
          DestroyList(L);
          system("pause");
          return 0;
          break;
        case 9://打印
          PrintList(L);
          system("pause");
          break;
        case 0:
          cout << "歡迎下次使用!" << endl;//退出
          system("pause");
          return 0;
          break;
        default:
          cout << "菜單序號輸入有誤!" << endl;
          system("pause");
          break;
        }
      }
      system("pause");
      return 0;
    }

    關于“C++數據結構之單鏈表如何實現”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++數據結構之單鏈表如何實現”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    c++
    AI

    广灵县| 汶上县| 阿拉善盟| 淮滨县| 松滋市| 保康县| 武宁县| 宝清县| 延长县| 乐平市| 苗栗市| 义马市| 广丰县| 永德县| 武鸣县| 额济纳旗| 监利县| 威宁| 大宁县| 禹城市| 元谋县| 东乌| 张掖市| 武清区| 四子王旗| 修水县| 休宁县| 瑞昌市| 根河市| 新晃| 古蔺县| 桂阳县| 怀远县| 沧州市| 民丰县| 织金县| 安图县| 巧家县| 镶黄旗| 黄梅县| 潼南县|