又一篇 链表练习

Posted itdef

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了又一篇 链表练习相关的知识,希望对你有一定的参考价值。

#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;
}

  

以上是关于又一篇 链表练习的主要内容,如果未能解决你的问题,请参考以下文章

又一篇四则运算代码

算法热门:环形链表的又一解法(LeetCode 142)

链表解说和基本操作练习附代码

sql连接又一篇

重学数据结构篇2 下链表代码练习

又一篇Centos7下的asp.net core部署教程