简单数据结构之链式表(C++实现)

本文详细介绍了使用C++实现链表的基本操作,包括初始化、清空、获取长度、查找元素、遍历链表、插入元素及删除指定元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 ============================================================================
 Name        : Node.cpp
 Author      : ntsk13 beijiwei@qq.com
 Version     :
 Copyright   : GPL
 Description : Link list study, complement by C++
 Date        : 2015.06.15
 ============================================================================
 */

#include <iostream>

using namespace std;

typedef struct {
	int data;
}Elem_t;

typedef struct lnode{
	Elem_t e;
	struct lnode * next;
}node,*pnode;

class Link
{
public:
	void init(pnode * L);
	void clear(pnode *L);
	int  get_length(pnode *L);
	Elem_t get_elem(pnode *L,int i);

	void traverse(pnode *L);
	void insert(pnode *L,Elem_t e,int i);
	void delete_elem(pnode *L,int i);
};


int main(void) {
	pnode H=NULL;//head p
	Elem_t zero,one,two,three,four,five;
	zero.data=0;
	one.data=1;
	two.data=2;
	three.data=3;
	four.data=4;

	Link list;

	list.init(&H);
	list.insert(&H,zero,0);
	list.insert(&H,one,1);
	list.insert(&H,two,2);
	list.insert(&H,three,3);
	list.insert(&H,four,4);

	list.traverse(&H);
	cout<<"len is "<<list.get_length(&H)<<endl;
	five=list.get_elem(&H,4);
	cout<<"================================="<<endl;
	cout<<"five is "<<five.data<<endl;
	list.delete_elem(&H,4);
	cout<<"================================="<<endl;
	list.traverse(&H);
	cout<<"len is "<<list.get_length(&H)<<endl;

	return 0;
}

void Link::init(pnode * L)
{
	*L=new node;//构造一个头结点

	((*L)->e).data =0;//头结点的data作为长度
	(*L)->next=NULL;

}
void Link::clear(pnode *L)
{
	int i=0;
	pnode p=*L;
	pnode tmp=NULL;
	int len=( (*L)->e).data;
	for(i=0;i<len;i++)
	{
		tmp=p->next;
		delete p;
		p=tmp;
	}
	*L=NULL;

}

int Link::get_length(pnode *L)
{
	return ( (*L)->e).data;;
}
Elem_t Link::get_elem(pnode *L,int i)
{
	int j=0;
	pnode p=(*L)->next;
	while(j <i )
	{
		j++;
		p=p->next;
	}
	return p->e;
}

void Link::traverse(pnode *L)
{
	int i=0;
	pnode p=(*L)->next;//避免把头指针元素输出
	int len=( (*L)->e).data;
	for(i=0;i< len;i++)
	{
		cout<<"The "<<i<<"th elem is "<<(p->e).data<<endl;
		p=p->next;
	}
}

void Link::insert(pnode *L,Elem_t e,int i)// before i insert
{
	int j=0;
	pnode p=*L;
	pnode tmp=NULL;
	for(j=0;j< i;j++)
	{
		p=p->next;
	}
	tmp=new node;
	(tmp->e).data=e.data;

	tmp->next=p->next;
	p->next=tmp;
	( (*L)->e).data++;

}
void Link::delete_elem(pnode *L,int i)
{
	int j=0;
	pnode p=(*L)->next;
	pnode tmp=NULL;
	for(j=0;j< i-1;j++)
	{
		p=p->next;
	}
	tmp=p;
	p->next=p->next->next;
	( (*L)->e).data--;
	delete  tmp->next;
}



===================================
/*
 ============================================================================
 Name        : Node.cpp
 Author      : ntsk13 beijiwei@qq.com
 Version     :
 Copyright   : GPL
 Description : Link list study, complement by C++
 Date        : 2015.06.15
 ============================================================================
 */

#include <iostream>

using namespace std;

typedef struct {
	int data;
}Elem_t;

typedef struct lnode{
	Elem_t e;
	struct lnode * next;
}node,*pnode;

class Link
{
public:
	void init(pnode & L);
	void clear(pnode & L);
	int  get_length(pnode &L);
	Elem_t get_elem(pnode &L,int i);

	void traverse(pnode &L);
	void insert(pnode &L,Elem_t e,int i);
	void delete_elem(pnode &L,int i);
};


int main(void) {
	pnode H=NULL;//head p
	Elem_t zero,one,two,three,four,five;
	zero.data=0;
	one.data=1;
	two.data=2;
	three.data=3;
	four.data=4;

	Link list;

	list.init(H);
	list.insert(H,zero,0);
	list.insert(H,one,1);
	list.insert(H,two,2);
	list.insert(H,three,3);
	list.insert(H,four,4);

	list.traverse(H);
	cout<<"len is "<<list.get_length(H)<<endl;
	five=list.get_elem(H,4);
	cout<<"================================="<<endl;
	cout<<"five is "<<five.data<<endl;
	list.delete_elem(H,4);
	cout<<"================================="<<endl;
	list.traverse(H);
	cout<<"len is "<<list.get_length(H)<<endl;

	return 0;
}

void Link::init(pnode & L)
{
	L=new node;//构造一个头结点

	(L->e).data =0;//头结点的data作为长度
	L->next=NULL;

}
void Link::clear(pnode & L)
{
	int i=0;
	pnode p=L;
	pnode tmp=NULL;
	int len=(L->e).data;
	for(i=0;i<len;i++)
	{
		tmp=p->next;
		delete p;
		p=tmp;
	}
	L=NULL;

}

int Link::get_length(pnode & L)
{
	return (L->e).data;;
}
Elem_t Link::get_elem(pnode & L,int i)
{
	int j=0;
	pnode p=L->next;
	while(j <i )
	{
		j++;
		p=p->next;
	}
	return p->e;
}

void Link::traverse(pnode & L)
{
	int i=0;
	pnode p=L->next;//避免把头指针元素输出
	int len= (L->e).data;
	for(i=0;i< len;i++)
	{
		cout<<"The "<<i<<"th elem is "<<(p->e).data<<endl;
		p=p->next;
	}
}

void Link::insert(pnode & L,Elem_t e,int i)// before i insert
{
	int j=0;
	pnode p=L;
	pnode tmp=NULL;
	for(j=0;j< i;j++)
	{
		p=p->next;
	}
	tmp=new node;
	(tmp->e).data=e.data;

	tmp->next=p->next;
	p->next=tmp;
	( L->e).data++;

}
void Link::delete_elem(pnode & L,int i)
{
	int j=0;
	pnode p=L->next;
	pnode tmp=NULL;
	for(j=0;j< i-1;j++)
	{
		p=p->next;
	}
	tmp=p;
	p->next=p->next->next;
	(L->e).data--;
	delete  tmp->next;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值