单链表的构造(C++)

 链表是用一组任意的存储单元来存储线性表中的数据元素。(目前我只能理解为一列元素连接在一起形成的链安静

链表特性:链表的每个节点都与它前后的节点存在联系。

1-2-3-4-5

这便很好的说明了链表,链表中每一个节点不仅存放这自己的本节点的值,而且还存放着下指向一个节点的指针。

链表节点的描述:

(基于链表的特性,我们常用一个结构体来描述链表的节点)

  struct node{                
       int  data;             

       node *next;            

};                           

链表元素的插入:

通常向链表中插入一个元素时,我们需要考虑最多的就是插入的位置,即是否插入的是链表的表头以及所插入的链表是否为空,所以插入元素时需要特别考虑这两种情况。

如果插入位置在表头我们只需将插入元素作为表头元素即可;

如果插入位置在中间,只需要把待插入的连接点断开,然后前一个节点内的指针指向待插入元素所形成的新节点,新形成的节点指向后一个节点,这样链表又重新连接起来,新元素便插入其中。

链表元素的删除:

首先查找待删除的元素,然后把该元素的前一个节点内的指针指向(该元素的)后一个节点即可。

其他还有关于链表的小问题有:链表长度的确定、链表的所有元素的删除、链表表头的获得。

下面建立一个链表,命名为list

实现的功能有:

链表的插入   insertint numint adata) 将adata插入到链表的第num个位置

链表的删除   delint adata)  将链表中的adata元素删除

链表的长度   getlength( )

链表的输出   output()

Code

 

#include<iostream>
#include<string>
using namespace std;
struct node{
	int data;
	node *next;
}; //链表节点
class list
{
public:
	list() {head=NULL;}
	void insert(int num,int adata);//在链表的第nun个节点上插入adata
	void del(int adata);//删除adata节点
	int  getlength();//获得链表的长度
	void output();//输出链表
private:
	node *head;
};
int list::getlength()
{
	node *p;
	p=head;
	int len;
	len=0;
	while(p!=NULL)
	{
		len++;
		p=p->next;
	}
	return len;
}
void list::insert(int num,int adata)
{
     node *p,*q,*s;
	 int i;
	 s=(node *)new(node);//这里必须初始化s
	 p=head;
	 s->data=adata;
	 if(num<0)//细节  保证插入的节点处存在
		 return ;
	 else if(num==1)//如果插入的节点为表头
	 {
		 s->next=p;
		 head=s;
	 }
	 else
	 {
		 for(i=1;i<num;i++)
		 {
			 if(p==NULL)//细节  如果插入的位置超过了链表的总长度
			 {
				 cout<<"insert failed"<<endl;
				 return ;
			 }

			 q=p;
			 p=p->next;
		 }
		 
	    q->next=s;
	    s->next=p;
		
		
	 }
}
void list::del(int adata)
{
	node *p,*q;
    p=head;
	if(p==NULL)
		return ;
	else if(p->data==adata)
	{
		head=p->next;
		delete p;
	}
	else
	{
		while(p->data!=adata&&p->next!=NULL)//遍历到该元素或者或者遍历结束后循环结束
		{
			q=p;//q记录查找节点的前一个节点
			p=p->next;
		}
		if(p->data==adata)//如果查找到该节点 删除
		{
			q->next=p->next;
			delete p;
		}
	}
}
void list::output()
{
	node *cur;
	cur=head;
	while(cur!=NULL)//注  链表中的p->next即代表一个节点 这里一定不要写作cur->next!=NULL
	{
		cout<<cur->data<<" ";
		cur=cur->next;
	}
	cout<<endl;
}
//实例测试
int main()
{
	list no1;
	int i;
	no1.insert(1,0);
	for(i=10;i>0;i--)
    //插入测试
	no1.insert(2,i);
	no1.output();
	//删除测试
	for(i=0;i<11;i++)
	{
		if(i%2)
			no1.del(i);
	}
    //输出测试
	no1.output();
	//长度测试
	cout<<no1.getlength()<<endl;
	return 0;
}


***注意事项***

由于链表节点中存在指向下一节点的指针,所以在程序中总把p->next当做是p节点的一部分数据(其实是下一个节点)。如写循环条件时总把while(p->next!=NULL)  实际需要whilep=NULL),这里出错过。

另一点,一个新节点的内存分配也会忘记:s=node*newnode);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值