1. 程式人生 > >Data Structure

Data Structure

namespace light char ati ret pre div 數據 !=

寫在前面

數據結構這種東西,還是需要學習一下的。不能投機取巧用STL了,得學會自己手寫,畢竟效率差距非常大。

關鍵是明白原理,然後需要自己手寫實踐一下,踩坑才行。

代碼能力太差,需要多寫代碼提高。

樹形數據結構可能用指針比較多吧。另外那些可以用指針寫的數據結構就用指針寫。畢竟效率高(可以裝逼)

鏈表

雙向鏈表(最常用的鏈表,沒有之一)

#include<cstdio>
#include<cstdlib>
using namespace std;
typedef struct ListNode{
    int data;
    ListNode* pre;
    ListNode* nxt;
}List;
int length;
 
List* CreateList(int len)
{
    List* ret=(List*)malloc(sizeof(List));
    List* tail=ret;
    ret->pre=ret,ret->nxt=ret,ret->data=1;
    for(int i=2;i<=len;i++)
    {
        List* newnode=(List*)malloc(sizeof(List));
        newnode->data=i,
        tail->nxt=newnode,newnode->pre=tail,newnode->nxt=ret,tail=newnode;
    }
    ret->pre=tail;
    length=len;
    return ret;
}
void Delete(List* pos)
{
    pos->pre->nxt=pos->pre;
    pos->nxt->pre=pos->nxt;
    free(pos);
    length--;
}
List* JumpToItem(List* list,int n)
{
    if(n==0) return list;
    while(n--)
        list=list->nxt;
    return list;
}
void Print(List* list)
{
    printf("%d ",list->data);
    for(int i=2;i<=length;i++)
    {
        list=list->nxt;
        printf("%d ",list->data);
    }
    printf("\n");
}
void InsertAft(List* pos,int data)
{
    List* newnode=(List*)malloc(sizeof(newnode));
    newnode->data=data,
    newnode->pre=pos,newnode->nxt=pos->nxt,pos->nxt=newnode;
    length++;
}
void InsertBef(List* pos,int data)
{
    pos=pos->pre;
    InsertAft(pos,data);
}
int main()
{
    List* list=CreateList(15);
    Print(list);
    Delete(list);
    Print(JumpToItem(list,1));
    InsertAft(list,233);
    Print(JumpToItem(list,1));
    InsertBef(JumpToItem(list,2),2333);
    Print(JumpToItem(list,1));
    return 0;
}

  Trie樹

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef struct TrieNode{
	TrieNode* nxt[26];
	bool isStr;
	TrieNode(){memset(nxt,NULL,sizeof(nxt));isStr=false;}
}Trie;
inline void insert(Trie* root,char* str)
{
	if(root==NULL||str==‘\0‘)return;
	Trie* p=root;
	while(*str!=‘\0‘)
	{
		int pos=*str-‘a‘;
		if(p->nxt[pos]==NULL)
		{
			Trie* newnode=new Trie;
			p->nxt[pos]=newnode;
		}
		p=p->nxt[pos];
		++str;
	}
	p->isStr=1;
}
inline bool search(Trie* root,char* str)
{
	Trie* p=root;
	while(p!=NULL&&*str!=‘\0‘)
	{
		p=p->nxt[*str-‘a‘];
		++str;
	}
	return (p!=NULL&&p->isStr==1);
}
inline void del(Trie* root)
{
	for(int i=0;i<26;i++)
		if(root->nxt[i]!=NULL)del(root->nxt[i]);
	delete root;
}
int main()
{
	Trie* root=new Trie;
	insert(root,"maki");
	printf(search(root,"maki")?"1":"0");
	return 0;
}

  

Data Structure