學習C++數據結構很重要,數據結構的知識用c++來實現是很直觀容易理解的,有一句大家都說的快爛掉的話:眼高手低。
數據結構裏面的知識點的確是很容易理解,但是理解不等於會寫出正確高效的代碼來。我今天晚上沒事就寫個雙鏈表,構思時依然感覺很簡單,可下筆時感覺並不是想象中的那樣。暈~~
//LinkList.h
#include<iostream>
using namespace std;
template <class Type>
struct Node
{
Type data;
Node<Type>*next;
Node<Type>*back;
};
template <class Type>
class LinkList
{
public:
LinkList();
~LinkList();
int Length()const;
void Init();
Node<Type>*GetElemPtr(int position)const;
Type GetElem(int position,Type &e)const;
Type SetElem(int position,Type &e)const;
void Delete(int position,Type &e);
void Insert(int position,Type &e);
private:
Node<Type> *first;
Node<Type> *head;
int position;
};
template <class Type>
void LinkList<Type>::Init()
{
first=new Node<Type>;
head=first;
first->next=first;
first->back=first;
}
template <class Type>
LinkList<Type>::LinkList()
{
Init();
}
template <class Type>
LinkList<Type>::~LinkList()
{
Node<Type>*ptr;
while(first)
{
ptr=first->next;
delete first;
first=ptr;
}
}
template <class Type>
int LinkList<Type>::Length()const
{
int icount=0;
for(Node<Type>*ptr=head;ptr!=NULL;ptr=ptr->next)
icount++;
return icount;
}
template <class Type>
Node<Type>* LinkList<Type>::GetElemPtr(int position)const
{
if(position==0)
return head;
Node<Type> *temptr=head->next;
int curPosition=1;
while(temptr!=head&&curPosition<position)
{
temptr=temptr->next;
curPosition++;
}
if(temptr!=head&&curPosition==position)
return temptr;
else return NULL;
}
template <class Type>
Type LinkList<Type>::GetElem(int position,Type &e)const
{
if(position<0||position>Length())
printf("查詢位置錯誤!\n");
else
{
Node<Type>*Ptr;
Ptr=GetElemPtr(position);
e=Ptr->data;
return e;
}
}
template <class Type>
Type LinkList<Type>::SetElem(int position,Type &e)const
{
if(position<0||position>Length())
printf("修改位置錯誤!\n");
Node<Type> *val;
val=GetElemPtr(position);
val->data=e;
return e;
}
template <class Type>
void LinkList<Type>::Delete(int position,Type &e)
{
if(position<0||position>Length())
{
printf("刪除結點失敗!\n");
}
else
{
printf("刪除結點成功!\n");
Node<Type> *ptr;
ptr=GetElemPtr(position);
ptr->back->next=ptr->next;
ptr->next->back=ptr->back;
e=ptr->data;
//Length()--;
delete ptr;
}
}
template <class Type>
void LinkList<Type>::Insert(int position,Type &e)
{
if(position<0||position<Length())
{
printf("插入位置失敗!\n");
}
else
{
Node<Type>*point,*pert;
point=GetElemPtr(position);
pert->data=e;
pert->back=point;
pert->next=point->next;
point->next=pert;
point->next->back=pert;
printf("成功在%d後插入元素:",position);
cout<<e<<endl;
//Length()++;
}
}
using namespace std;
template <class Type>
struct Node
{
Type data;
Node<Type>*next;
Node<Type>*back;
};
template <class Type>
class LinkList
{
public:
LinkList();
~LinkList();
int Length()const;
void Init();
Node<Type>*GetElemPtr(int position)const;
Type GetElem(int position,Type &e)const;
Type SetElem(int position,Type &e)const;
void Delete(int position,Type &e);
void Insert(int position,Type &e);
private:
Node<Type> *first;
Node<Type> *head;
int position;
};
template <class Type>
void LinkList<Type>::Init()
{
first=new Node<Type>;
head=first;
first->next=first;
first->back=first;
}
template <class Type>
LinkList<Type>::LinkList()
{
Init();
}
template <class Type>
LinkList<Type>::~LinkList()
{
Node<Type>*ptr;
while(first)
{
ptr=first->next;
delete first;
first=ptr;
}
}
template <class Type>
int LinkList<Type>::Length()const
{
int icount=0;
for(Node<Type>*ptr=head;ptr!=NULL;ptr=ptr->next)
icount++;
return icount;
}
template <class Type>
Node<Type>* LinkList<Type>::GetElemPtr(int position)const
{
if(position==0)
return head;
Node<Type> *temptr=head->next;
int curPosition=1;
while(temptr!=head&&curPosition<position)
{
temptr=temptr->next;
curPosition++;
}
if(temptr!=head&&curPosition==position)
return temptr;
else return NULL;
}
template <class Type>
Type LinkList<Type>::GetElem(int position,Type &e)const
{
if(position<0||position>Length())
printf("查詢位置錯誤!\n");
else
{
Node<Type>*Ptr;
Ptr=GetElemPtr(position);
e=Ptr->data;
return e;
}
}
template <class Type>
Type LinkList<Type>::SetElem(int position,Type &e)const
{
if(position<0||position>Length())
printf("修改位置錯誤!\n");
Node<Type> *val;
val=GetElemPtr(position);
val->data=e;
return e;
}
template <class Type>
void LinkList<Type>::Delete(int position,Type &e)
{
if(position<0||position>Length())
{
printf("刪除結點失敗!\n");
}
else
{
printf("刪除結點成功!\n");
Node<Type> *ptr;
ptr=GetElemPtr(position);
ptr->back->next=ptr->next;
ptr->next->back=ptr->back;
e=ptr->data;
//Length()--;
delete ptr;
}
}
template <class Type>
void LinkList<Type>::Insert(int position,Type &e)
{
if(position<0||position<Length())
{
printf("插入位置失敗!\n");
}
else
{
Node<Type>*point,*pert;
point=GetElemPtr(position);
pert->data=e;
pert->back=point;
pert->next=point->next;
point->next=pert;
point->next->back=pert;
printf("成功在%d後插入元素:",position);
cout<<e<<endl;
//Length()++;
}
}
//main.cpp
#include"LinkList.h"
int main(void)
{
LinkList<int> la;
int e(0),position(0),y(0);
cout<<"別急首先要生成線性表,請輸出元素:";
while((scanf("%d",&e))==1)
la.Init();
cout<<"1、求線性表的長度length;"<<endl
<<"2、取某一位置上的元素;"<<endl
<<"3、把某一位置上的元素換成新值;"<<endl
<<"4、刪除某一位結點;"<<endl
<<"5、在某一位後插入一個結點;"<<endl
<<"請選擇你要完成項(1~5):"<<endl;
while(cin>>y&&y>0&&y<6)
{
switch(y)
{
case 1:printf("鏈表的長度是%d",la.Length());break;
case 2:cin>>position;
printf("第%d位上元素是",position,la.GetElem(position,e));
break;
case 3:cin>>position>>e;
printf("第%d位上元素由%d換成%d",position,la.GetElem(position,e),la.SetElem(position,e));
break;
case 4:cin>>position;
la.Delete(position,e);
break;
case 5:cin>>position>>e;
la.Insert(position,e);
break;
}
}
return 0;
}
int main(void)
{
LinkList<int> la;
int e(0),position(0),y(0);
cout<<"別急首先要生成線性表,請輸出元素:";
while((scanf("%d",&e))==1)
la.Init();
cout<<"1、求線性表的長度length;"<<endl
<<"2、取某一位置上的元素;"<<endl
<<"3、把某一位置上的元素換成新值;"<<endl
<<"4、刪除某一位結點;"<<endl
<<"5、在某一位後插入一個結點;"<<endl
<<"請選擇你要完成項(1~5):"<<endl;
while(cin>>y&&y>0&&y<6)
{
switch(y)
{
case 1:printf("鏈表的長度是%d",la.Length());break;
case 2:cin>>position;
printf("第%d位上元素是",position,la.GetElem(position,e));
break;
case 3:cin>>position>>e;
printf("第%d位上元素由%d換成%d",position,la.GetElem(position,e),la.SetElem(position,e));
break;
case 4:cin>>position;
la.Delete(position,e);
break;
case 5:cin>>position>>e;
la.Insert(position,e);
break;
}
}
return 0;
}
結果調試時出現了一些無法想象的錯誤。說我的exe文件所加載的DLL文件有bug。暈死~~~