日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

数据结构(06)— 线性循环链表实战

發布時間:2023/11/28 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构(06)— 线性循环链表实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 循環鏈表定義

單鏈的循環鏈表結點的存儲結構和單鏈表的存儲結構一樣, 所不同的是: 最后一個結點的 next 域指向頭結點, 而不是“空”。這樣, 由表尾很容易找到表頭。

但若鏈表較長, 則由表頭找到表尾較費時, 因而, 單循環鏈表往往設立尾指針而不是頭指針, 如圖 2 31所示。這在兩個鏈表首尾相連合并成一個鏈表時非常方便。


2. 循環鏈表實現

2.1 創建單循環空鏈表

RingList::RingList()
{L = new LNode;  // 產生頭結點,并使L指向此頭結點L->next = L;    // 指針域指向頭結點std::cout << "constructor done" << std::endl;
}

2. 銷毀單循環鏈表

	LNode *q;LNode *p = L->next; // p指向頭結點while (p != L)  // 沒到表尾{q = p->next;delete p;p = q;}// 到達末尾, p == Ldelete p;p = NULL;

2.3 循環鏈表中插入元素

2.4 循環鏈表中刪除元素

3. 代碼清單

project.h

#include <iostream>
#include <string>#define N (30)
#define K (9)
// 單鏈表中單個結點的完整數據結構定義
typedef struct LNode
{int data;       // 值域LNode *next;    // 指針域
}LNode;class RingList
{
public:RingList();~RingList();int init_ring_list();int clear_list();bool is_empty();int get_list_length();int get_element(int i, int &value);int insert_element(int i, int value);int delete_element(int i, int &value);int print_list();private:LNode *L;
};

project.cpp

#include "project.h"RingList::RingList()
{L = new LNode;  // 產生頭結點,并使L指向此頭結點L->next = L;    // 指針域指向頭結點std::cout << "constructor done" << std::endl;
}RingList::~RingList()
{LNode *q;LNode *p = L->next; // p指向頭結點while (p != L)  // 沒到表尾{q = p->next;delete p;p = q;}// 到達末尾, p == Ldelete p;p = NULL;std::cout << "destructor done" << std::endl;
}int RingList::clear_list()
{L = L->next;    // L指向頭結點LNode *q;LNode *p = L->next; // p指向第一個結點while (p != L)  // 沒到表尾{q = p->next;delete p;p = q;}L->next = L;    // 頭結點指針域指向自身std::cout << "destructor done" << std::endl;return 0;
}bool RingList::is_empty()
{return L->next == L ? true : false;
}int RingList::get_list_length() 
{int length = 0;LNode *p = L->next; // p指向頭結點while (p != L)  // 沒到表尾{length++;p = p->next;}return length;
}int RingList::get_element(int i, int &value)
{if(i <= 0 || i > get_list_length()){std::cout << "i is not a valid value" << std::endl;return -1;}LNode *p = L->next; // p指向頭結點for(int k=1; k<i; k++)  // 順指針向后查找,直到p指向第i個元素{p = p->next;}value = p->data;return 0;
}int RingList::insert_element(int i, int value)
{if(i<=0){std::cout << "i is not a valid value" << std::endl;return -1;}LNode *p = L->next; // p指向頭結點for(int k=1; k<i; k++)    // 尋找第i-1個結點{p = p->next;}LNode *q = new LNode;   // 生成新結點q->data = value;// 插入L中q->next = p->next;p->next = q;// 改變尾結點if(p == L){L = q;}return 0;
}int RingList::delete_element(int i, int &value)
{if(i<=0 || i > get_list_length()){std::cout << "i is not a valid value" << std::endl;return -1;}LNode *p = L->next; // p指向頭結點for(int k=1; k<i; k++)    // 尋找第i-1個結點{p = p->next;}LNode *q;q = p->next;    // q指向待刪除結點value = q->data;p->next = q->next;if(L == q)  // 刪除的是表尾元素{L = p;}delete q;  // 釋放待刪除結點q = NULL;return 0;
}int RingList::print_list()
{LNode *p = L->next->next; // p指向首元結點while (p != L->next)  // p不指向頭結點{std::cout << "list element is " << p->data << std::endl;p = p->next;}return 0;
}

```main.cpp`

#include "project.cpp"int main()
{RingList L;std::cout << "is empty: " << L.is_empty() << std::endl;L.insert_element(1, 10);L.insert_element(2, 20);L.insert_element(3, 30);L.print_list();std::cout << "list length: " << L.get_list_length() << std::endl;int value;L.get_element(3, value);std::cout << "第三個元素為: " << value << std::endl;int del_value;L.delete_element(2, del_value);std::cout << "刪除的第二個元素為: " << del_value << std::endl;
}

總結

以上是生活随笔為你收集整理的数据结构(06)— 线性循环链表实战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。