1.设计并编写链表类,能够实现链表的初始化(建立)、输出释放等功能。
(1)链表由若干个结点【Node类对象】构成(每个结点有data域和next域,假设每个结点的data域是一个整数,并且没有重复元素).
(2)利用Node类,设计并编写Link(链表)类,类中包含:
- 数据成员
- Head //头指针
- Num //链表中结点个数 【即链表的长度】
- 函数成员:
- Link( ) //初始化(建立)空链表
- Link(int n) //初始化(建立)一个具有n个结点的链表
【在建立链表的过程中按值从小到大排序】
【即将p链表连接在当前链表的尾部】
- LinkPrint( ) //输出链表中所有结点data域的值
- GetHead( ) //返回链表的头指针
- ~Link( ) //释放链表中所有结点的内存空间
- Link_Insert(int x) //在链表中插入值为x的结点
- Link_Delete( int x) //删除链表中值为x的结点
- Link_Connect(Link &p) //两个链表的连接
- Link( Link &p) //使用深复制编写复制构造函数
Node.h
#include <iostream>
using namespace std;
class Node {
public:
Node();
Node(Node &n);
Node(int x);
void SetNext(Node *p);
int Getd();
Node *GetNext();
~Node();
private:
int data;
Node *next;
};
#endif //SHIYSA_NODE_H
Node.cpp
#include "Node.h"
Node::Node()
{
cin>>data;
next=NULL;
}
Node::Node(int x) {
data = x;
next = NULL;
}
Node::Node(Node &n) {
data = n.data;
next = n.next;
}
void Node::SetNext(Node *p)
{
next = p;
}
int Node::Getd()
{
return data;
}
Node *Node::GetNext()
{
return next;
}
Node::~Node() {
cout<<data<<" 被析构!"<<endl;
}
Link.h
#include "Node.h"
class Link {
public:
Link();
Link(int n);
~Link();
Link(Link &p);
void LinkPrint();
Node *GetHead();
void Link_Insert(int x);
void Link_Delete(int x);
void Link_Connect(Link &p);
private:
Node *head;
int num;
};
#endif //SHIYSA_LINK_H
Link.cpp
#include "Link.h"
Link::Link() {
head = NULL;
num = 0;
}
Link::Link(int n) {
head = new Node(0);
num = n;
Node *hp = head;
for(int i = 0; i<n;i++){
Node *s = new Node();
if(i == 0) {
hp->SetNext(s);
}
else{
Node *sp = head;
int flag = 0;
while(sp->GetNext() != NULL){
if(sp->GetNext()->Getd() < s->Getd()){
sp = sp->GetNext();
}
else{
s->SetNext(sp->GetNext());
sp->SetNext(s);
flag = 1;
break;
}
}
if(flag == 0){
sp->SetNext(s);
}
}
}
}
Link::Link(Link &p) {
head = new Node(0);
Node *cp = head;
Node *sp = p.head;
while(sp->GetNext() != NULL){
Node *s = new Node(*sp->GetNext());
cp->SetNext(s);
cp = cp->GetNext();
sp = sp->GetNext();
}
num = p.num;
}
Link::~Link() {
Node *hp;
while(head->GetNext() != NULL){
hp = head->GetNext();
delete head;
head = hp;
}
if(head != NULL) { delete head; }
num = 0;
}
void Link::LinkPrint() {
Node *p = head;
while(p->GetNext() != NULL){
cout << p->GetNext()->Getd() << " ";
p = p->GetNext();
}
cout<<endl;
}
Node *Link::GetHead() {
return head;
}
void Link::Link_Insert(int x){
Node *n = new Node(x);
Node *p = head;
int flag = 0;
while(p->GetNext() != NULL){
if(p->GetNext()->Getd() < x){
p = p->GetNext();
}
else{
n->SetNext(p->GetNext());
p->SetNext(n);
flag = 1;
break;
}
}
if(flag == 0){
p->SetNext(n);
}
num++;
}
void Link::Link_Delete(int x) {
Node *p = head;
int flag = 0;
while(p->GetNext() !=NULL){
if(p->GetNext()->Getd() != x){
p = p->GetNext();
}
else{
Node *tem = p->GetNext();
p->SetNext(p->GetNext()->GetNext());
delete tem;
num--;
flag = 1;
break;
}
}
if(flag == 0){
cout << "不存在值为" << x << "的节点!" << endl;
}
}
void Link::Link_Connect(Link &pl)
{
Node *p=head;
num+=pl.num;
while(p->GetNext()!=NULL)
p=p->GetNext();
Node *t=pl.head->GetNext();
while(t!=NULL)
{
p->SetNext(new Node(t->Getd()));
p=p->GetNext();
t=t->GetNext();
}
}
main.cpp
int main() {
cout<<"创建3个节点的链表L1"<<endl;
Link L1(3);
L1.LinkPrint();
cout<<"请输入插入的数字 "<<endl;
int x;
cin>>x;
L1.Link_Insert(5);
L1.LinkPrint();
cout << "请输入要删除的元素:" << endl;
cin >> x;
L1.Link_Delete(x);
L1.LinkPrint();
cout<<"创建3个节点的链表L2"<<endl;
Link L2(3);
cout<<"连接 L1,L2"<<endl;
L1.Link_Connect(L2);
L1.LinkPrint();
cout<<"L3复制L2"<<endl;
Link L3(L2);
L3.LinkPrint();
return 0;
}