带头结点的单链表类C++手动实现
最近在复习数据结构,看到单链表这部分,现在用的教材大部分都是严蔚敏的C语言版吧,参考了一些书籍,手动编写了C++下单链表类的实现,环境是Visual Studio 2010,函数是对照着教材声明挑了个写的。代码如下:
/*带头结点的单链表类C++手动实现
作者:许多
*/ #include <iostream>
using namespace std;
class MyList;
//提前声明 class LNode
{
//结点类 friend MyList;
private: int data;
LNode *next;
};
class MyList{
//链表类 public: void InitList(int n);
//头插法初始化带头结点的表,长度为n,不算头结点 void DestroyList();
//摧毁表 void ClearList();
//清空表 bool ListEmpty();
//判空 int ListLength();
//取表长 int GetElem(int i);
//取第i个结点的值 int LocateElem(int e);
//找出值为e的元素是第几个元素 bool ListInsert(int i, int e);
//第i个位置插入元素e bool ListDelete(int i);
//删除第i个元素 void PrintList();
//输出链表 private: LNode *head;
//头指针 };
void MyList::InitList(int n)
{ int x;
head = new LNode;
head->next = NULL;
for(int i=n;i>0;--i)
{
cin>>x;
LNode *p = new LNode;
p->data = x;
p->next = head->next;
head->next = p;
}
}
void MyList::DestroyList()
{ delete head;
cout<<"表摧毁了!"<<endl;
}
void MyList::ClearList()
{ head->next = NULL;
cout<<"清空完毕!"<<endl;
}
bool MyList::ListEmpty()
{
if(head->next == NULL) return true; else return false;
}
int MyList::ListLength()
{
LNode *p=head;
int j=0;
while(p->next)
{ p=p->next; j++; } return j;
}
int MyList::GetElem(int i)
{ int j=1;
LNode *p=head->next;
//第一个结点 if(i<1) return NULL;
while(p&&j<i)
{
p=p->next; j++; } return p->data;
}
int MyList::LocateElem(int e)
{
int i=0; LNode *p=head->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
i++;
}
if(p==NULL) return 0;
else return i+1;
}
bool MyList::ListInsert(int i, int e)
{ LNode *p, *s;
int j=1;
p=head;
while(p&&j<i)
{p=p->next;j++;}
if(p==NULL) return false;
if((s = new LNode)==NULL) return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool MyList::ListDelete(int i)
{ LNode *p,*q;
int j=1;
p=head;
while(p&&j<i)
{ p=p->next;j++;}
if(p==NULL) return false;
q=p->next;
p->next=q->next;
delete q;
return true;
}
void MyList::PrintList()
{ if(ListEmpty())
{ cout<<"表是空的!"<<endl;
} else
{ cout<<"表中元素为:";
LNode *p = head->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
}
补充:软件开发 , C++ ,