数据结构(06)— 线性循环链表实战
生活随笔
收集整理的這篇文章主要介紹了
数据结构(06)— 线性循环链表实战
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 循環(huán)鏈表定義
單鏈的循環(huán)鏈表結(jié)點的存儲結(jié)構(gòu)和單鏈表的存儲結(jié)構(gòu)一樣, 所不同的是: 最后一個結(jié)點的 next 域指向頭結(jié)點, 而不是“空”。這樣, 由表尾很容易找到表頭。
但若鏈表較長, 則由表頭找到表尾較費時, 因而, 單循環(huán)鏈表往往設(shè)立尾指針而不是頭指針, 如圖 2 31所示。這在兩個鏈表首尾相連合并成一個鏈表時非常方便。
2. 循環(huán)鏈表實現(xiàn)
2.1 創(chuàng)建單循環(huán)空鏈表
RingList::RingList()
{L = new LNode; // 產(chǎn)生頭結(jié)點,并使L指向此頭結(jié)點L->next = L; // 指針域指向頭結(jié)點std::cout << "constructor done" << std::endl;
}
2. 銷毀單循環(huán)鏈表
LNode *q;LNode *p = L->next; // p指向頭結(jié)點while (p != L) // 沒到表尾{q = p->next;delete p;p = q;}// 到達末尾, p == Ldelete p;p = NULL;
2.3 循環(huán)鏈表中插入元素
2.4 循環(huán)鏈表中刪除元素
3. 代碼清單
project.h
#include <iostream>
#include <string>#define N (30)
#define K (9)
// 單鏈表中單個結(jié)點的完整數(shù)據(jù)結(jié)構(gòu)定義
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; // 產(chǎn)生頭結(jié)點,并使L指向此頭結(jié)點L->next = L; // 指針域指向頭結(jié)點std::cout << "constructor done" << std::endl;
}RingList::~RingList()
{LNode *q;LNode *p = L->next; // p指向頭結(jié)點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指向頭結(jié)點LNode *q;LNode *p = L->next; // p指向第一個結(jié)點while (p != L) // 沒到表尾{q = p->next;delete p;p = q;}L->next = L; // 頭結(jié)點指針域指向自身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指向頭結(jié)點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指向頭結(jié)點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指向頭結(jié)點for(int k=1; k<i; k++) // 尋找第i-1個結(jié)點{p = p->next;}LNode *q = new LNode; // 生成新結(jié)點q->data = value;// 插入L中q->next = p->next;p->next = q;// 改變尾結(jié)點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指向頭結(jié)點for(int k=1; k<i; k++) // 尋找第i-1個結(jié)點{p = p->next;}LNode *q;q = p->next; // q指向待刪除結(jié)點value = q->data;p->next = q->next;if(L == q) // 刪除的是表尾元素{L = p;}delete q; // 釋放待刪除結(jié)點q = NULL;return 0;
}int RingList::print_list()
{LNode *p = L->next->next; // p指向首元結(jié)點while (p != L->next) // p不指向頭結(jié)點{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;
}
總結(jié)
以上是生活随笔為你收集整理的数据结构(06)— 线性循环链表实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国手术室设备行业市
- 下一篇: 2022-2028年中国非溶聚丁苯橡胶行