`

C++简单链表/STL

 
阅读更多
#include<iostream>
#include<string>

using namespace std;

//——————————————————————————————————————————————————————————————————————
namespace LinkList {
	struct LinkNode{
		string Item;
		struct LinkNode *Next;
	};

	LinkNode *CreateNode(string item){
		LinkNode *node = new LinkNode();
		if(node)
		{
			node->Item = item;
			node->Next = NULL;
		}
		return node;
	}

	bool PushNode(LinkNode *head,string item){
		LinkNode *node = CreateNode(item);
		if(node){
			node->Next = head->Next;
			head->Next = node;
			return true;
		} else {
			return false;
		}
	}

	LinkNode* PopNode(LinkNode *head){
		LinkNode *prev,*curr;
		if(head == NULL || head->Next == NULL){
			return NULL;
		}
		prev = head;
		curr = prev->Next;
		while(curr->Next){
			prev = curr;
			curr = curr->Next;
		}
		prev->Next = NULL;
		return curr;
	}

	bool AppendNode(LinkNode *head,string item){
		LinkNode *node = CreateNode(item);
		if(!node){
			return false;
		}
		LinkNode *tail = head;
		while(tail->Next != NULL){
			tail = tail->Next;
		}
		tail->Next = node;
		return true;
	}

	LinkNode* FindNode(LinkNode *head,string item){
		LinkNode *node = head->Next;
		while(node!=NULL){
			if(node->Item == item){
				return node;
			} else {
				node = node->Next;
			}
		}
		return NULL;
	}

	void DeleteNode(LinkNode *head,string item){
		LinkNode *tail = head, *node;
		while(tail->Next!=NULL){
			if(tail->Next->Item == item){
				node = tail->Next;
				tail->Next = node->Next;
				delete(node);
			} else{
				tail = tail->Next;
			}
		}
	}

	void DeleteAll(LinkNode *head){
		if(head){
			while(head->Next!=NULL){
				DeleteAll(head->Next);
				head->Next=NULL;
			}
			delete(head);
			head=NULL;
		}
	}

	void _insert_for_sort(LinkNode *head,LinkNode *node){
		LinkNode *prev = NULL,*curr;
		node->Next = NULL;

		if(head->Next == NULL){
			head->Next = node; // 插入第一个数据节点
		} else {
			curr = head->Next;
			prev = head;
			while(curr) {	//如果curr为空,则目标节点最大,插在末尾
				if(curr->Item > node->Item){ //找到一个节点数据比目标节点大,插在前面
					break;
				}
				prev = curr;
				curr = curr->Next;
			}
			node->Next = prev->Next;
			prev->Next = node;
		}
	}

	void SortNode(LinkNode *head){
		LinkNode *prev,*curr;

		if(NULL == head || NULL == head->Next){
			return;
		}

		curr = head->Next;
		head->Next = NULL;

		while(curr){
			prev = curr;
			curr = curr->Next;

			_insert_for_sort(head, prev);
		}
	}
	
}
//——————————————————————————————————————————————————————————————————————

int main(){

	LinkList::LinkNode *head = LinkList::CreateNode("");
	if(head){
		LinkList::AppendNode(head,"A");
		LinkList::AppendNode(head,"B");
		LinkList::AppendNode(head,"C");
		LinkList::PushNode(head,"D");
		LinkList::AppendNode(head,"E");
		LinkList::AppendNode(head,"F");
		LinkList::PushNode(head,"F");
		LinkList::AppendNode(head,"E");
		LinkList::PushNode(head,"G");

		LinkList::DeleteNode(head,"E");

		LinkList::LinkNode *find = LinkList::FindNode(head,"A");
		find->Item="O";
		LinkList::DeleteNode(head,"M");
	}

	if(head){
		LinkList::LinkNode *test = head->Next;
		while(test!=NULL){
			cout << test->Item << endl;
			test = test->Next;
		}
	}

	cout << endl;
	LinkList::SortNode(head);

	LinkList::LinkNode *tt = LinkList::PopNode(head);

	cout << tt->Item << endl;
	cout << endl;

	LinkList::DeleteAll(tt);
	
	if(head){
		LinkList::LinkNode *test = head->Next;
		while(test!=NULL){
			cout << test->Item << endl;
			test = test->Next;
		}
	}
	LinkList::DeleteAll(head);
	return 0;
}

用valgrind查看无内存泄漏

root # valgrind ./a.out
==5602== Memcheck, a memory error detector
==5602== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==5602== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==5602== Command: ./a.out
==5602==
G
D
O
B
C
F
==5602==
==5602== HEAP SUMMARY:
==5602==     in use at exit: 0 bytes in 0 blocks
==5602==   total heap usage: 20 allocs, 20 frees, 430 bytes allocated
==5602==
==5602== All heap blocks were freed -- no leaks are possible
==5602==
==5602== For counts of detected and suppressed errors, rerun with: -v
==5602== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

 Vector数组自定义排序

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>

using namespace std;

class People{
public:
	string name;
	int age;
public:
	People(string name,int age){
		this->name = name;
		this->age = age;
	}
	bool operator < (const People &p) const{
//		return name < p.name;
		return age < p.age;
	}
};

bool less_operator(const People &p1, const People &p2){
//	return p1.name < p2.name;
	return p1.age < p2.age;
}

int main(){

	vector<People> vp;
	vector<People>::iterator vpi;
	
	People p1("ciaos",26);
	People p2("stone",25);
	People p3("tiger",27);
	People p4("apple",21);
//	People *p5 = new People("marks",50);	//memory leak
	
	vp.push_back(p1);
	vp.push_back(p2);
	vp.push_back(p3);
	vp.push_back(p4);
//	vp.push_back(*p5);

	for(vpi = vp.begin();vpi != vp.end();vpi ++){
		cout << (*vpi).name << " " << (*vpi).age << endl;
	}
	
	sort(vp.begin(),vp.end());
//	sort(vp.begin(),vp.end(),less_operator);

	for(int i=0;i<vp.size();i++){
		cout << vp[i].name << " " << vp[i].age << endl;
	}

	return 0;
}

 Map基本操作

#include<iostream>
#include<map>
#include<algorithm>
#include<string>

using namespace std;

bool match_second(pair<int,string> data, string target){
	return (data.second == target)?true:false;
}

int main(){

	map<int,string> co;
	map<int,string>::iterator coi;

	co.insert(pair<int,string>(10086,"mobile"));
	co.insert(pair<int,string>(10010,"union"));
	co.insert(pair<int,string>(12306,"train"));
	co.insert(pair<int,string>(10000,"telecom"));

	for(coi = co.begin();coi != co.end();coi ++){
		cout << (*coi).first << " " << (*coi).second << endl;
	}
	
	coi = co.find(10010);
	cout << (*coi).first << " " << (*coi).second << endl;
	co.erase(coi);
	cout << endl;

	coi = find_if(co.begin(),co.end(),bind2nd(ptr_fun(match_second),"train"));
	if(coi != co.end()) {
		cout << (*coi).first << " " << (*coi).second << endl; 
	}

	cout << endl;
	for(coi = co.begin();coi != co.end();coi ++){
		cout << (*coi).first << " " << (*coi).second << endl;
	}
//	sort(vp.begin(),vp.end());
//	sort(vp.begin(),vp.end(),less_operator);


	return 0;
}

  

分享到:
评论

相关推荐

    C++/STL/读书笔记

    C++/STL/读书笔记是对C++标准模板库(Standard Template Library,简称STL)深入学习的重要资源。STL是C++编程中不可或缺的一部分,它提供了高效且可重用的数据结构和算法,极大地提高了代码的编写效率和可读性。...

    C/C++/STL/數據結構/LINUXC編程實例

    标题 "C/C++/STL/數據結構/LINUXC編程實例" 涵盖了几个关键的编程领域,包括C和C++语言、STL(Standard Template Library)、数据结构以及Linux C编程。让我们逐一深入探讨这些知识点。 C语言是计算机科学的基础,...

    C++文档/ETL/STL

    在C++中,`ETL`和`STL`是两个重要的概念,它们分别代表了不同的编程工具和技术。 `ETL`是"Extract, Transform, Load"的缩写,这在数据处理领域是一个关键术语。ETL过程通常用于大数据管理和分析,它涉及从不同来源...

    c++/STL容器设计相关

    在C++编程语言中,STL(Standard Template Library,标准模板库)是不可或缺的一部分,它提供了高效、便捷的数据结构和算法。STL容器是STL的核心组成部分,它们为程序员提供了组织和管理数据的方式。本节将深入探讨...

    C/C++ STL参考手册 STL帮助文档 中文/英文版都有

    STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它为程序员提供了高效且灵活的数据结构和算法。STL的主要组件包括容器、迭代器、算法和函数对象,这些组件共同构成了一个...

    数据结构C++描述--STL源代码

    在C++中,STL(Standard Template Library,标准模板库)为实现这些数据结构提供了强大的工具。STL由一系列模板类和函数组成,包括容器、迭代器、算法和仿函数等组成部分。 1. 容器:STL中的容器是用于存储数据的...

    C++双向链表统计文章单词出现频率

    在C++中,标准模板库(STL)提供了一个名为`list`的容器,它实现了双向链表。双向链表允许我们在O(1)的时间复杂度内进行前向或后向遍历,这对于我们的任务来说非常方便,因为我们需要遍历整个文本并统计单词。 接...

    数据结构课程设计案例精编(C++/STL) code

    在这个“数据结构课程设计案例精编(C++/STL)”中,我们将深入探讨使用C++编程语言以及STL(Standard Template Library,标准模板库)来实现各种经典数据结构及其算法。 首先,C++是一种强大且灵活的面向对象编程...

    c/c++ STL api 文档

    C/C++ STL(Standard Template Library,标准模板库)是C++编程语言中不可或缺的一部分,它提供了高效、可重用的数据结构和算法。STL的主要组件包括容器、迭代器、算法和函数对象,这些组件共同构成了一个强大的工具...

    c++标准库STL手册

    **C++标准库STL手册** C++标准模板库(STL)是C++编程语言中的一个重要组成部分,它提供了一组高效、可重用的容器、迭代器、算法和函数对象,大大简化了数据结构和算法的实现。STL手册通常会详细阐述这些组件的使用...

    C++库函数及STL算法

    在C++编程中,库函数和STL(Standard Template Library,标准模板库)是不可或缺的组成部分,它们极大地提升了代码的效率和可读性。本文将深入探讨C++库函数和STL算法,以及如何在实际编程中应用这些概念。 首先,...

    C++模板编程和STL编程

    C++ STL(Standard Template Library,标准模板库)是C++库的核心部分,它包含了一系列高效、泛型的容器(如`std::vector`、`std::list`)、迭代器、算法和函数对象。STL的目标是提供一组工具,使得开发者能够以简洁...

    C++ STL程序员面试题

    C++ STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,为程序员提供了高效且灵活的数据结构和算法。STL的主要组件包括容器(如vector、list、set等)、迭代器、算法和函数...

    c++对链表建立,查找,删除处理

    链表是一种基础且重要的数据结构,它在计算机科学中扮演着关键角色,特别是在C++这样的编程语言中。链表与数组不同,不依赖于连续的内存空间,而是通过节点之间的指针连接。在这个"c++对链表建立,查找,删除处理"的...

    STL.rar_C++ STL_C++ STL_STL_STL c++_STL教程

    C++中的STL,全称为Standard Template Library(标准模板库),是C++编程语言中一个极其重要的组成部分。它提供了一组高效、灵活且可重用的容器、算法和迭代器等编程工具,大大简化了复杂的数据结构操作和算法实现。...

    C/C++ 参考手册

    尽管《C/C++参考手册》未包含STL的算法部分,但STL的容器如`std::vector`(动态数组)和`std::list`(双向链表)是值得深入研究的。它们允许开发者以抽象的方式处理数据集合,而无需关注底层实现的细节。 STL的迭代...

Global site tag (gtag.js) - Google Analytics