【數據結構與算法】鏈表

#include<iostream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;

struct ListNode{
	int value;
	ListNode *p_Next
}; 
void AddToTail(ListNode** pHead, int value){
	ListNode* pNew = new ListNode();
	pNew->value =value;
	pNew->p_Next =NULL;
	
	if(*pHead==NULL){
		*pHead =pNew;
	}
	else{
		ListNode* pNode = *pHead;
		while(pNode->p_Next != NULL)
			pNode=pNode->p_Next;
			
		pNode->p_Next =pNew;
	}
}

int main(){
	//freopen("1.a","r",stdin);
	//freopen("2.a","w",stdout);
	
	/*
	鏈表中每一個元素存有兩個值,一個值是指向下一個元素的指針,另一個值是數據
	鏈表的第一個元素稱爲對頭,最後一個元素稱爲隊尾,存儲鏈表時只需要記住對頭元素的地址(指針)即可
	在鏈表中查找,訪問一個元素的複雜度是O(n)
	如果已經定位好了需要插入或刪除的元素,插入刪除是O(1)
	鏈表支持:查找第i個元素,刪除第i個元素,在位置i插入一個元素
	
	雙向鏈表:在鏈表基礎上,記錄指向隊尾的尾指針,此外每個元素多記錄一個指向前一個元素的指針 
	*/
	
	
	return 0;
}
#include<iostream>
#include<list>
using namespace std;


/*
鏈表由一系列的結點組成,結點包含兩個域,一個數據域,一個指針域
鏈表內存:
	非連續,添加刪除元素,時間複雜度都是常數項,不需要移動元素,比數組添加刪除效率高

鏈表需要額外的空間保持結點關係,前驅後繼 前一個結點的指針next指向下一個結點的地址 
鏈表最後的結點中的指針(next) 指向爲空 
*/ 


/*
push_back(elem);    //在容器尾部加入一個元素 
pop_back();			//刪除容器最後一個元素 
push_front(elem);
pop_front();
insert(pos,elem);		//在pos位置插入elem元素的拷貝,返回新數據的位置 
insert(pos,n,elem);		//在pos位置插入n個elem數據,無返回值 
insert(pos,beg,end);		//在pos位置插入[beg,end)區間的數據,無返回值 
clear();
erase(beg,end);			//刪除[beg,end)區間的數據,返回下一個數據的位置 
erase(pos);				//刪除pos位置的數據,返回下一個數據的位置 
remove(elem);			//刪除容器中 所有 與elem值相匹配的元素 

size
empty
resize(num) 
resiz(num,elem) 
*/

void test1()
{
	list<int> l;
	list<int> l2(10,10);		//(10 個 10)
	list<int> l3(l2);
	list<int> l4(l2.begin(),l2.end());
	
	for(list<int>::iterator i=l4.begin();i!=l4.end();i++)
		cout<<*i<<" ";
	cout<<endl;
	
	l.push_back(100);
	l.push_back(200);
	l.insert(l.begin(),300);
	l.insert(l.end(),400);
	
	list<int>::iterator it=l.begin();
	it++;
	it++;
	l.insert(++l.begin(),500);		//++可以,但l.begin+2之類就不可以 ,這裏的第一個參數是const_iterator 
	l.insert(it,1000);		//注意,這裏的it用的begin和現在的begin不一樣 
	for(list<int>::iterator i=l.begin();i!=l.end();i++)
		cout<<*i<<" ";
	cout<<endl;
	
	l.pop_back();
	l.pop_front();
	l.erase(l.begin(),--l.end());
	for(list<int>::iterator i=l.begin();i!=l.end();i++)
		cout<<*i<<" ";
	cout<<endl;
	l.push_back(233);
	l.push_back(200);
	l.remove(200);
	for(list<int>::iterator i=l.begin();i!=l.end();i++)
		cout<<*i<<" ";
	cout<<endl;
}

//assign,swap,=
void test2(){
	list<int> l;
	l.assign(2,10);
	list<int> l2;
	l2.push_back(3);
	l2.push_back(24);
	l2.push_back(1);
	l2.push_back(1);
	l2.push_back(9);
	list<int> l3;
	l3=l; 
	
	l2.reverse();
	for(list<int>::iterator i=l2.begin();i!=l2.end();i++)
		cout<<*i<<" ";
	cout<<endl;\
	l2.reverse();
	for(list<int>::iterator i=l2.begin();i!=l2.end();i++)
		cout<<*i<<" ";
	cout<<endl;
	l2.sort();
	for(list<int>::iterator i=l2.begin();i!=l2.end();i++)
		cout<<*i<<" ";
	cout<<endl;
	
}
/*
reverse();			//反轉列表
sort();			//list排序 
*/

void test3(){
	list<int> l;
	int a[5]={2,3,4,5,6};
	l.assign(&a[1],&a[3]);      //取地址,則屬於beg到end,結果是3,4
	l.assign(a[1],a[3]);      //不取地址,則屬於n個elem,結果是5,5,5, 
	for(list<int>::iterator i=l.begin();i!=l.end();i++)
		cout<<*i<<" ";
	cout<<endl;
}

//排序,默認從小到大
bool count(int x,int y){
	return x>y;
}
void test4(){
	list<int> l;
	int a[12]={2,3,4,5,6,6,3,24,7,1,3,2};
	l.assign(&a[1],&a[9]);
	for(list<int>::iterator i=l.begin();i!=l.end();i++)
		cout<<*i<<" ";
	cout<<endl;
	l.sort(count);		//********* 
	for(list<int>::iterator i=l.begin();i!=l.end();i++)
		cout<<*i<<" ";
	cout<<endl;
	//從大到小排序
	//對對象排序可以參考這個 
	
} 

//算法裏提供的sort   只支持可隨機訪問的容器 
//list不支持隨機訪問,所以不能+5,+3什麼的 
//對象排序 
int main(){
	
	
	test4();
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章