单链表的实现

1.前言

顺序表是以数组下标邻接关系来表示线性表中数据元素之间的逻辑结构。其特性具有以下缺点:

a、数组容量难以确定,我们往往给出一个确定的容量数值。

b、在进行插入,删除操作时,往往需要移动大量的数组元素。

产生其原因:静态储存分配。

解决方法:使用动态储存分配,也就是链式存储结构(看来学习单链表是非常有必要的)。

2、单链表的实现

demo:

#include<iostream>
using namespace std;


template <class DataType>  //类模板作用:int a,a代表整形类型变量,而DataType代表数据类型的变量。
struct Node //数组用来存储同一类的数据元素,然而结构体可以存储不同类的数据元素
{
DataType data;
Node<DataType> *next;
};


template <class DataType>
class LinkList
{
public:
LinkList();
~LinkList(){};
LinkList(DataType a[],int n);
void print();
void add(DataType x,int i);
DataType del(int i);
int locate(DataType x);
private:
Node<DataType> *first;

};


template <class DataType>
LinkList<DataType>::LinkList()
{
first=new Node<DataType>;
first->next=NULL;//头结点的指针域为空
}
template <class DataType>
LinkList<DataType>::LinkList(DataType a[],int n)
{
Node<DataType> *s,*r;
first=new Node<DataType>;
r=first;
for(int i=0;i<n;i++)
{
s=new Node<DataType>;//建立一个新的节点,把值赋予这个节点的数据域,然后和上一个节点进行联系 
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;//当然最后一个节点为空
}
template <class DataType>
void LinkList<DataType>::print()
{
Node<DataType> *p;
//first=new Node<DataType>;
p=first->next;
while(p!=NULL)
{
cout<<p->data<<endl;
p=p->next;
}
}
template <class DataType>
void  LinkList<DataType>::add(DataType x,int i)//添加
{
Node<DataType> *p,*s;
p=first;
int count=0;
while(p!=NULL&&count<i-1)//找到i-1节点
{
p=p->next;
count++;
}
if(p==NULL) throw "位置";
else
{
s=new Node<DataType>;
s->data=x;
s->next=p->next;//先和下一个连接,在和上一个连接。 
p->next=s;
}
}
template <class DataType>
DataType LinkList<DataType>::del(int i)
{
Node<DataType> *p,*s;
p=first;
int count=0;
while(p!=NULL&&count<i-1)
{
p=p->next;
count++;
}
if(p==NULL||p->next==NULL) throw "没有该节点";
else{
//s=new Node<DataType>;
s=p->next;
int x=s->data;
p->next=s->next;
delete s;
return x;


}
template <class DataType>
int  LinkList<DataType>::locate(DataType x)
{
Node<DataType> *p;
p=first;
int count=0;
while(p!=NULL)
{
p=p->next;
count++;
if(p->data==x){
return count;
}
}
return 0;
/* Node<DataType> *p=first->next;
int count=1;
while(p!=NULL)
{
if(p->data==x) return count;
p=p->next;
count++;
}
return 0;*/
}
 
int main()
{
int data[5]={1,2,3,4,5};
LinkList<int> r(data,5);
//r.add(6,2);
//r.del(2);
r.print();
cout<<r.locate(2);
return 0;

}

3、tip:学习其本质,并建立起模型,在脑中以动图形式播放。

        学而不思则罔!

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值