学习C++数据结构很重要,数据结构的知识用c++来实现是很直观容易理解的,有一句大家都说的快烂掉的话:眼高手低。
数据结构里面的知识点的确是很容易理解,但是理解不等于会写出正确高效的代码来。我今天晚上没事就写个双链表,构思时依然感觉很简单,可下笔时感觉并不是想象中的那样。晕~~
//LinkList.h
#include
using namespace std;
template
struct Node
{
 Type data;
 Node*next;
 Node*back;
};
template
class LinkList
{
public:
 LinkList();
 ~LinkList();
 int Length()const;
 void Init();
 Node*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 *first;
 Node *head;
 int position;
};
template
void LinkList::Init()
{
 first=new Node;
 head=first;
 first->next=first;
 first->back=first;
}
template
LinkList::LinkList()
{
 Init();
}
template
LinkList::~LinkList()
{
 Node*ptr;
 while(first)
 {
  ptr=first->next;
  delete first;
  first=ptr;
 }
}
template
int LinkList::Length()const
{
 int icount=0;
 for(Node*ptr=head;ptr!=NULL;ptr=ptr->next)
  icount++;
 return icount;
}
template
Node* LinkList::GetElemPtr(int position)const
{
 if(position==0)
  return head;
 Node *temptr=head->next;
 int curPosition=1;
 while(temptr!=head&&curPosition {
  temptr=temptr->next;
  curPosition++;
 }
 if(temptr!=head&&curPosition==position)
  return temptr;
 else return NULL;
}
template
Type LinkList::GetElem(int position,Type &e)const
{
 if(position<0||position>Length())
  printf("查询位置错误!\n");
 else
 {
  Node*Ptr;
     Ptr=GetElemPtr(position);
     e=Ptr->data;
     return e;
 }
}
template
Type LinkList::SetElem(int position,Type &e)const
{
 if(position<0||position>Length())
  printf("修改位置错误!\n");
 Node *val;
 val=GetElemPtr(position);
 val->data=e;
 return e;
}
template
void LinkList::Delete(int position,Type &e)
{
 if(position<0||position>Length())
 {
  printf("删除结点失败!\n");
 }
 else
 {
  printf("删除结点成功!\n");
  Node *ptr;
  ptr=GetElemPtr(position);
  ptr->back->next=ptr->next;
  ptr->next->back=ptr->back;
  e=ptr->data;
  //Length()--;
  delete ptr;
 }
}
template
void LinkList::Insert(int position,Type &e)
{
 if(position<0||position {
  printf("插入位置失败!\n");
 }
 else
 {
  Node*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<  //Length()++;
 }
}
//main.cpp
#include"LinkList.h"
int main(void)
{
 LinkList la;
 int e(0),position(0),y(0);
 cout<<"别急首先要生成线性表,请输出元素:";
 while((scanf("%d",&e))==1)
  la.Init();
 cout<<"1、求线性表的长度length;"<  <<"2、取某一位置上的元素;"<  <<"3、把某一位置上的元素换成新值;"<  <<"4、删除某一位结点;"<  <<"5、在某一位后插入一个结点;"<  <<"请选择你要完成项(1~5):"< 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。晕死~~~