学习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。晕死~~~