带头结点的单链表类C++手动实现
2011-07-15 19:29
357 查看
最近在复习数据结构,看到单链表这部分,现在用的教材大部分都是严蔚敏的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++手动实现
作者:许多*/
#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++手动实现
- 不带头结点的链表头插法C++实现
- 数据结构(5)线性表之链表C++实现带头结点的单链表合并
- 数据结构 带头结点的单链表 操作大全 最全的链表操作(c++实现)
- 【c++版数据结构】之双链表的实现(带头结点以及尾节点)
- C++实现带头结点的单链表(友元类)
- 【c++版数据结构】之单链表的实现(带头结点以及尾节点)
- 带头结点的链表头插法C++实现
- C++模板实现双向循环链表(有带头结点)
- 带头结点单链表的各种各种运算(C++模板类实现)
- 用C++实现数据结构二 带头结点的单链表
- 经典算法与数据结构的c++实现——带头结点的单链表
- 带头结点的链表尾插法C++实现
- C++实现带头结点单链表
- 【c++版数据结构】之循环双链表的实现(带头结点以及尾节点)
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
- 数据结构实验-用C++实现带头结点的循环链表
- C++实现单链表常用功能(不带头结点)
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
- 使用不带头结点的循环链表实现队列(数据结构)