用c++和面向对象描述带结点的链表类
最近自学数据结构,对链表部分的内容做了一些总结,具体如下:
结点的定义
对于链表的结点,我选择用结构体来描述,当然还可以用复合类,继承等方法来描述,代码如下:
#include<iostream>
#include<string>
using namespace std;
struct LinkNode{
int data;
LinkNode *link;
LinkNode(LinkNode *p=NULL )
{
link=p;
} //结构体的构造函数,只初始化指针
LinkNode(const int item,LinkNode *p=NULL)
{
data=item;
link=p;
} //结构体的构造函数 ,初始化指针和数据
};
链表类的定义
class List{
private:
LinkNode *first;
public:
List() { first=new LinkNode; } //构造函数 ,调用结构体只初始化指针的构造函数
List(const int x)
{
first=new LinkNode(x);
} //构造函数,调用结构体的第二个构造函数
~List()
{
makeEmpty();
} //析构函数
void makeEmpty() ; //将链表置为空表
int Length() const ;//常成员函数,返回链表的长度
LinkNode *getHead()
{
return first;
} //返回头结点
LinkNode *search(int x) ; //搜索含x的元素
LinkNode *Locate(int i) ;//搜索第i个元素的地址
void setData(int i,int &x) ; //用x修改第i个元素的值
bool getData(int i,int &x) const; //取出第i个元素的值
bool Insert(int i,int &x); //在第i个元素后插入x
bool remove(int i,int &x); //删除第i个元素,x返回该元素的值
bool IsEmpty()const //判断链表是否为空
{
if(first->link!=NULL)
return true;
else return false;
}
void display();
void append(int x); //在链表的末尾添加元素
};
类中函数的实现
void List::makeEmpty()
{
LinkNode *p;
while(first->link!=NULL) //链表不为空的时候,就一直删除,只剩下头结点
{
p=first->link;
first->link=p->link;
delete p; //delete函数释放p所指向的那片空间,p所占用的空间在函数结束后自动释放
}
} //将链表置为空链表
int List::Length() const
{
LinkNode *p;
p=first->link;
int count=0;
while(p!=NULL)
{
p=p->link; //顺序不要反了
count++;
}
return count;
} //带有附加头结点链表的长度
LinkNode* List::search(int x)
{
LinkNode *current;
current=first->link;
while(current!=NULL)
{
if(current->data==x) break;
else current=current->link;
}
return current;
} //搜索含x的结点,成功则返回x结点的地址,否则返回NULL
LinkNode* List::Locate(int i)
{
LinkNode *current;
current=first; //有一个问题是带头结点的链表,0元素从哪里开始
int k=0;
while(current!=NULL&&k<i)
{
current=current->link;
k++;
}
return current;
} //返回第i个结点的地址
bool List::getData(int i,int &x) const
{
if(i<=0) return NULL;
LinkNode *current;
current=first;
int k=0;
while(current!=NULL&&k<i)
{
current=current->link;
k++;
}
if(current==NULL)
return false;
else
{
x=current->data;
return true;
}
} //取出链表中第i个元素的值
bool List::Insert(int i,int &x)
{
LinkNode *current=Locate(i);
if(current==NULL) return false;
LinkNode *newnode =new LinkNode(x) ; //创建一个新的结点,调用LinkNode结构体的构造函数给其初始化
//插入操作
newnode->link=current->link;
current->link=newnode;
return true;
} //将一个新的结点插入到第i个元素的后面,该结点的数据部分为x
void List::setData(int i,int &x)
{
if(i<=0) return;
LinkNode *current;
current=Locate(i);
if(current==NULL)
return ;
else
current->data=x;
}
bool List::remove(int i,int &x)
{
LinkNode *current;
if(i<=0) return false ;
current=Locate(i-1); //注意此处为i-1,不是i
if(current==NULL||current->link==NULL)
return false;
LinkNode *del;
del=current->link;
current->link=del->link;
x=del->data;
delete del;
return true ;
}
void List::display()
{
LinkNode *current;
current=first->link;
while(current->link!=NULL)
{
cout<<current->data<<endl;
current=current->link;
}
}
void List::append(int x)
{
LinkNode *newnode=new LinkNode(x);
LinkNode *current=first;
while(current->link!=NULL)
{
current=current->link;
}
current->link=newnode;
}
主函数部分
主函数中主要是一些测试函数功能的代码,可根据自己的需求,自行编写相应代码
int main()
{
List l;
int i;
for(i=1;i<=20;i++)
{
l.append(i);
}
cout<<"原链表:"<<endl;
l.display();
int length=l.Length();
cout<<"链表长度:"<<length<<endl; //带上头结点,长度为20
int x=22;
bool loc=l.Insert(19,x);
cout<<"插入成功:"<<loc<<endl;
cout<<"插入后的链表:"<<endl;
l.display();
int y;
int m=l.remove(8,y);
cout<<"删除的元素为:"<<y<<endl;
cout<<"删除后的链表为:"<<endl;
l.display();
int n=16;
l.setData(6,n);
cout<<"修改后的链表"<<endl;
l.display();
return 0;
}
第一次发帖,上述内容如有错误,欢迎各位大神指正!