線性鏈表

學習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()++;
 }
}
//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;
}
結果調試時出現了一些無法想象的錯誤。說我的exe文件所加載的DLL文件有bug。暈死~~~
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章