zoukankan      html  css  js  c++  java
  • 又一篇 链表练习

    #ifndef LINK_H
    #define LINK_H
    
    #include <memory>
    #include <iostream>
    
    struct ListNode {
        int val;
        std::shared_ptr<ListNode> next;
    };
    
    struct LinkList{
        std::shared_ptr<ListNode> begin;
        std::shared_ptr<ListNode> end;
    };
    
    std::shared_ptr<ListNode>  CreateNode(int i);
    bool CreateLinkList(LinkList& ll,std::shared_ptr<ListNode>& insertNode);
    bool AppendNode(LinkList& ll,std::shared_ptr<ListNode>& insertNode);
    void PrintLinkList(const LinkList& ll);
    std::shared_ptr<ListNode> FindInLinkList(LinkList& ll,int findValue);
    bool DeleteNode(LinkList& ll,int value);
    
    
    #endif // LINK_H
    

      

    #include "link.h"
    
    std::shared_ptr<ListNode>  CreateNode(int i){
        std::shared_ptr<ListNode> p(new ListNode());
        p->val = i;
        p->next = nullptr;
        return p;
    }
    
    bool CreateLinkList(LinkList& ll,std::shared_ptr<ListNode>& insertNode){
        bool ret = false;
    
        ll.begin = ll.end = insertNode;
    
        ret =true;
        return ret;
    }
    
    bool AppendNode(LinkList& ll,std::shared_ptr<ListNode>& appendNode){
        bool ret = false;
        if( nullptr == appendNode){
            return ret;
        }
    
        if(nullptr == ll.end || nullptr == ll.begin){
            ll.begin = ll.end = appendNode;
            ret = true;
            return ret;
        }
    
        ll.end->next = appendNode;
        ll.end = appendNode;
    
        ret = true;
        return ret;
    }
    
    void PrintLinkList(const LinkList& ll){
        std::shared_ptr<ListNode> p = ll.begin;
        std::cout << "print linklist:  " << std::endl;
        while( p != nullptr ){
            std::cout << p->val << " ";
            p = p->next;
        }
        std::cout << std::endl;
        std::cout << std::endl;
    }
    
    std::shared_ptr<ListNode> FindInLinkList(LinkList& ll,int findValue){
        std::shared_ptr<ListNode> p = ll.begin;
        do{
            if(p->val == findValue){
               break;
            }
            p= p->next;
        }while(p != nullptr);
    
        return p;
    }
    
    
    bool DeleteNode(LinkList& ll,int value){
        bool ret = false;
    
        if(nullptr == ll.begin || nullptr == ll.end){
            return ret;
        }
    
        if(ll.begin->val == value){
            if(ll.begin == ll.end){
                ll.begin = ll.end = nullptr;
            }else{
                ll.begin = ll.begin->next;
            }
            ret = true;
            return ret;
        }
    
        // 遍历链表 查找符合的node
        std::shared_ptr<ListNode> p = ll.begin;
        while(p->next != nullptr){
           if(p->next->val == value){
               break;
           }
           p = p->next;
        }
        if(p->next != nullptr){
            if(p->next == ll.end){
                ll.end = p;
            }
            p->next = p->next->next;
        }
    
        ret = true;
        return ret;
    }
    

      

    // 123.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <assert.h>
    #include "link.h"
    
    #include <windows.h>
    
    void TestLinkList() {
    	LinkList ll;
    
    	if (!AppendNode(ll, CreateNode(1))) {
    		std::cerr << __FUNCTION__ << "().  line:" << __LINE__ << "  Error !" << std::endl;
    		return;
    	}
    	std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	std::cout << "end:" << ll.end << " end.val:" << ll.end->val << std::endl;
    	PrintLinkList(ll);
    
    	if (!AppendNode(ll, CreateNode(2))) {
    		std::cerr << __FUNCTION__ << "().  line:" << __LINE__ << "  Error !" << std::endl;
    		return;
    	}
    	std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	std::cout << "end:" << ll.end << " end.val:" << ll.end->val << std::endl;
    	PrintLinkList(ll);
    
    	if (!AppendNode(ll, CreateNode(3))) {
    		std::cerr << __FUNCTION__ << "().  line:" << __LINE__ << "  Error !" << std::endl;
    		return;
    	}
    	std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	std::cout << "end:" << ll.end << " end.val:" << ll.end->val << std::endl;
    	PrintLinkList(ll);
    
    	std::shared_ptr<ListNode> p = FindInLinkList(ll, 7);
    	assert(p == nullptr);
    
    	p = FindInLinkList(ll, 2);
    	assert(p != nullptr && p->val == 2);
    
    
    	DeleteNode(ll, 3);
    	std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	std::cout << "end:" << ll.end << " end.val:" << ll.end->val << std::endl;
    	PrintLinkList(ll);
    
    	DeleteNode(ll, 2);
    	std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	std::cout << "end:" << ll.end << " end.val:" << ll.end->val << std::endl;
    	PrintLinkList(ll);
    
    
    	DeleteNode(ll, 1);
    	// std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	// std::cout << "end:" << ll.end  << " end.val:" << ll.end->val  << std::endl;
    	PrintLinkList(ll);
    
    
    	if (!AppendNode(ll, CreateNode(1))) {
    		std::cerr << __FUNCTION__ << "().  line:" << __LINE__ << "  Error !" << std::endl;
    		return;
    	}
    	std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	std::cout << "end:" << ll.end << " end.val:" << ll.end->val << std::endl;
    	PrintLinkList(ll);
    
    	if (!AppendNode(ll, CreateNode(2))) {
    		std::cerr << __FUNCTION__ << "().  line:" << __LINE__ << "  Error !" << std::endl;
    		return;
    	}
    	std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	std::cout << "end:" << ll.end << " end.val:" << ll.end->val << std::endl;
    	PrintLinkList(ll);
    
    	if (!AppendNode(ll, CreateNode(3))) {
    		std::cerr << __FUNCTION__ << "().  line:" << __LINE__ << "  Error !" << std::endl;
    		return;
    	}
    	std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	std::cout << "end:" << ll.end << " end.val:" << ll.end->val << std::endl;
    	PrintLinkList(ll);
    
    	DeleteNode(ll, 1);
    	std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	std::cout << "end:" << ll.end << " end.val:" << ll.end->val << std::endl;
    	PrintLinkList(ll);
    
    	DeleteNode(ll, 2);
    	std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	std::cout << "end:" << ll.end << " end.val:" << ll.end->val << std::endl;
    	PrintLinkList(ll);
    
    	DeleteNode(ll, 3);
    	//std::cout << "begin:" << ll.begin << " begin.val:" << ll.begin->val << std::endl;
    	//std::cout << "end:" << ll.end  << " end.val:" << ll.end->val  << std::endl;
    	PrintLinkList(ll);
    }
    
    void TestLinkListMemory() {
    	LinkList ll;
     	LinkList ll0;
    	while(1)
    	{
    		for (int i = 1; i<1000; ++i) {
    			AppendNode(ll, CreateNode(i));
    		}
    
    	
    
    		for (int i = 1; i<1000; ++i) {
    			DeleteNode(ll, i);
    		}
    
    		std::cout << "begin:" << ll.begin << std::endl;
    		std::cout << "end:" << ll.end << std::endl;
    		PrintLinkList(ll);
    	}
    
    }
    
    unsigned int dictIntHashFunction(unsigned int key)
    {
    	key += ~(key << 15);
    	key ^= (key >> 10);
    	key += (key << 3);
    	key ^= (key >> 6);
    	key += ~(key << 11);
    	key ^= (key >> 16);
    	return key;
    }
    
    int main(int argc, char *argv[])
    {
    	TestLinkList();
    	TestLinkListMemory();
    		
    	return 0;
    }
    

      

  • 相关阅读:
    事件聚合IEventAggregator和 Ihandle<T>
    基于.NET打造IP智能网络视频监控系统
    包图Package
    MVC与EasyUI结合增删改查
    Helper Method
    Moq & RhinoMocks
    Asp.net MVC集成Google Calendar API(附Demo源码)
    你可能不知道的跨域解决方案
    jQuery选择器大全
    关于Sqlite的一个demo
  • 原文地址:https://www.cnblogs.com/itdef/p/6241459.html
Copyright © 2011-2022 走看看