c++实现 单链表

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值