您的位置:首页 > 编程语言 > C语言/C++

c++实现 单链表

2015-05-27 21:29 204 查看
Main.cpp
#include<iostream>
#include"LinkNode.h"
using namespace std;
int main()
{

LinkList l;
LinkList::LinkList();
LinkNode n;
l.HeadInsert(n.ProduceNode());
l.HeadInsert(n.ProduceNode());
l.HeadInsert(n.ProduceNode());
l.HeadInsert(n.ProduceNode());
cout<<l.Length()<<endl;
l.Insert(3,n.ProduceNode());
l.Output();
cout<<l.Find(1)<<endl;
cout<<l.Search(33)<<endl;
l.Delete(2);
l.Output();
return 0;
}

LinkNode.h
//#ifndef LinkNode_H
//#define LinkNode_H
#pragma once

typedef class LinkNode
{
friend class LinkList;  //友元类:LinkList类中所有函数成员都能访问LinkNode类中的数据成员
public:
LinkNode* ProduceNode();//产生一个节点
private:
int data;
LinkNode *pnext;
}LN,*PLN;

class LinkList
{
public:
LinkList();
~LinkList();
void HeadInsert(PLN) const;
bool IsEmpty() const;
int Length() const;
int Find(int k) const;
int Search(const int x) const;
void Delete(int k);
void Insert(int k, PLN);
void Output() const;
private:
LinkNode *phead; /* 头节点 */
};
//#endif

LinkNode.cpp
#include "LinkNode.h"
#include<iostream>
using namespace std;

//产生一个节点
PLN LinkNode::ProduceNode()
{
int val;
cout<<"输入节点数据:";
cin>>val;
PLN p=new LN();
p->data=val;
p->pnext=NULL;
return p;
}
//头插
void LinkList::HeadInsert(PLN l) const
{
l->pnext=phead->pnext;
phead->pnext=l;

}
/* 构造函数 首指针设置为NULL */
LinkList::LinkList()
{

phead=new LinkNode();
phead->pnext = NULL;
}
/* 利用析构函数删除链表所有节点,释放内存空间 */
LinkList::~LinkList()
{
LinkNode *p;

while (phead)
{
p = phead;
phead = phead->pnext;
delete p;
}
}
/* 链表为空,则返回TRUE,否则返回FALSE */
bool LinkList::IsEmpty() const
{
if (phead->pnext) /*  首指针不为空则链表非空 */
return false;
else
return true;
}
/* 返回链表中元素个数 */
int LinkList::Length() const
{
int length = 0;
LinkNode *p = phead->pnext;

while (p) /* 直到最后一个节点 */
{
p = p->pnext;
length++;
}
return length;
}
/* 返回loc位置的元素值 */
int LinkList::Find(int loc) const
{
if(loc<1||loc>Length())
cout<<"插入位置错误!注意本链表只有"<<Length()<<"节点!"<<endl;
else
{
PLN p=phead->pnext;
int i=1;
while(i<loc)
{
++i;
p=p->pnext;
}

return p->data;
}

}
/*返回L中第1个与x相等的数据元素的位序。若这样的数据元素不存在,则返回值为0 */
int LinkList::Search(const int x) const
{
LinkNode *p = phead->pnext;
int i = 1;

while (p)
{
if (p->data == x)
return i;
else
{
p = p->pnext;
i++;
}
}
if(!p)
return 0;
}

/* 插入到第k个节点之后 */
void LinkList::Insert(int loc, PLN x)
{
if(loc<1||loc>Length())
cout<<"插入位置错误!注意本链表只有"<<Length()<<"节点!"<<endl;
else
{
PLN p=phead;
int i=1;
while(i<loc)
{
++i;
p=p->pnext;
}

x->pnext=p->pnext;
p->pnext=x;
}

}
/* 删除第k个节点 */
void LinkList::Delete(int k)
{
if(k<1||k>Length())
cout<<"错误!注意本链表只有"<<Length()<<"节点!"<<endl;
else if(IsEmpty())
cout<<"链表为空,无法删除!!"<<endl;
else
{
PLN p=phead;
while(--k)   //采用--k,获取指向第k-1个节点的指针
p=p->pnext;
PLN q=p->pnext;
p->pnext=p->pnext->pnext;
delete(q);
}

}
/* 输出所有节点信息 */
void LinkList::Output() const
{
LinkNode *p = phead->pnext;

while (p)
{
cout <<p->data << "  ";
p = p->pnext;
}
cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: