带结点的单链表类的描述,基于c++

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

第一次发帖,上述内容如有错误,欢迎各位大神指正!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值