- #include <iostream>
- using namespace std;
- /结点///
- struct Node
- {
- int data; //数据
- Node* next;//下一个结点
- };
- /单链表/
- class LinkList
- {
- public:
- void Init();
- void Create(int n); //创建带n个数据的单链表
- void Dis(); //输出结果
- bool Insert(int i, int data); //在索引为i的位置插入数据为data的结点
- bool Delete(int i); //删除索引为i的结点
- void Destroy(); //销毁链表
- int GetLen(); //长度
- void Merge(LinkList& list); //归并单链表
- void Back(); //就地反转
- void Sort(); //排序
- bool HaveCircle(); //是否含有环
- Node* GetNode(); //获取头结点
- private:
- Node* head; //头结点
- };
- ///单链表实现
- void LinkList::Init()
- {
- head = new Node();
- head->next = NULL;
- }
- void LinkList::Create(int n)
- {
- Node* p = head;
- for (int i = 1 ; i <= n; ++i)
- {
- Node* temp = new Node();
- temp->data = i ;
- temp->next =NULL;
- p->next = temp;
- p = temp;
- }
- }
- void LinkList::Dis()
- {
- Node* p = head->next;
- while(p)
- {
- cout<<p->data<<"/t";
- p = p->next;
- }
- cout<<endl;
- }
- bool LinkList::Insert(int i, int data)
- {
- if (i <0 || i > GetLen())
- {
- return false;
- }
- Node* p = head;
- Node* q = head;
- for (int j = 0; j<i; j++)
- {
- q = p->next;
- p = p->next;
- }
- Node* InsertNode = new Node;
- InsertNode->data = data;
- InsertNode->next = q->next;
- q->next = InsertNode;
- return true;
- }
- bool LinkList::Delete(int i)
- {
- if (i < 0 || i >= GetLen())
- {
- return false;
- }
- Node* p = head;
- Node* q = head;
- for (int j = 0; j<i; j++)
- {
- q = p->next;
- p = p->next;
- }
- Node* DelNode = q->next;
- q->next = DelNode->next;
- delete DelNode;
- return true;
- }
- void LinkList::Destroy()
- {
- Node* p = head->next;
- while(p)
- {
- Node* temp = p;
- p = p->next;
- delete temp;
- }
- delete head;
- head->next = NULL;
- }
- int LinkList::GetLen()
- {
- int count = 0;
- Node* p = head->next;
- while(p)
- {
- p = p->next;
- ++count;
- }
- return count;
- }
- void LinkList::Merge(LinkList& list)
- {
- Node* p = head->next;
- while (p->next)
- {
- p = p->next;
- }
- Node* listNode = list.GetNode();
- p->next = listNode->next;
- }
- Node* LinkList::GetNode()
- {
- return head;
- }
- void LinkList::Sort()
- {
- //选择排序
- Node* p = head->next;
- while(p)
- {
- Node* small = p;
- Node* q = p->next;
- while(q)
- {
- if (q->data < small->data)
- {
- small = q;
- }
- q = q->next;
- }
- if (p != small)
- {
- int temp;
- temp = p->data;
- p->data = small->data;
- small->data = temp;
- }
- p = p->next;
- }
- }
- void LinkList::Back()
- {
- /*先把原来的链表头结点断开
- *建立一个新的链表,然后把原来的链表插入到新链表的头部
- *最后把原来链表头部指向新链表,最后注意要释放新链表的头部
- *也就是最后一个元素**************************************/
- LinkList tempList;
- tempList.Init();
- Node* TempNode = tempList.GetNode();
- Node* n = TempNode;
- Node* p = head->next;
- while(p)
- {
- Node* q = p->next;
- Node* temp = p;
- temp->next = TempNode;
- temp->data = p->data;
- TempNode = temp;
- p = q;
- }
- head->next = TempNode;
- Delete(GetLen() - 1);
- }
- bool LinkList::HaveCircle()
- {
- Node* p = head;
- Node* q = head;
- while ((p->next != NULL) && (q->next != NULL) && (q->next->next != NULL) )
- {
- p = p->next;
- q = q->next->next;
- if (p == q)
- {
- return true;
- }
- }
- return false;
- }
- int main()
- {
- LinkList list;
- list.Init();
- list.Create(4);
- LinkList list1;
- list1.Init();
- list1.Create(5);
- list.Merge(list1);
- list.Dis();
- list1.Dis();
- list1.Back();
- list1.Dis();
- list1.Sort();
- list1.Dis();
- cout<<list.HaveCircle()<<endl;
- return 0;
- }
单链表的实现(包括就地逆转单链表,表排序, 合并单链表、判断表是否有环)
最新推荐文章于 2019-02-02 20:04:05 发布