1.链表的定义就好像是一串灯笼,有头结点,有一个个结点来进行,数据的存储,遍历和删除
和顺序表的最大区别是在内存上链表在内存上的存储并不紧密,它的内存存储也更加灵活。首先是链表的的结构体定义
typedef struct Node
{
int data;
struct Node* next;
}Node,*PNODE; //PNODE == struct Node* PNODE 用来指向下一个节点在遍历中相当重要
2.链表的类的实现 首先就是链表的构造函数 析构函数的使用别再链表的对象实例化过程中起到数据的初始化以及数据的删除 接着就是类内的头结点和size表长的使用这部分由于是在类内是实现所以访问权限为protected
代码如下
class NodeList
{
protected :
PNODE head;
int size;
public :
NodeList() //构造函数
{
size=0;
head=new Node;
head->next=NULL;
head->data=0;
}
//析构函数 释放内存
~NodeList()
{
while(head->next!=NULL)
{
PNODE tmp=head->next;
head->next=tmp->next;
delete(tmp);
}
size=0;
delete(head);
}
核心部分弄完后就该弄链表的一些操作
1.插入操作 思路为在插入操作中在定义一个PNODE的tmp指针指向我们插入的值data再定义一个指针last 来遍历到PNODE指针域的末尾直到 last的值为空将tmp赋值给last指针
//插入节点
void insert(int data)
{
PNODE tmp =new Node;
tmp->data=data;
tmp->next=NULL;
PNODE last =head;
while(last->next !=NULL)
{
last=last->next;
}
last->next=tmp;
size++;
}
2.删除操作
删除操作则是将链表的节点中的数据域和要删除的数进行比较若有进行删除的数则将这个节点的前一个节点指向后一个节点 按值删除和按下标删除是类似的
//按值删除
void link_delete(int data)
{
if(size<1)
{
return ;
}
bool flag =false;
int key=0;
PNODE next =head->next;
while(next!=NULL)
{
if(next->data==data)
{
flag =true;
break;
}
key++;
next=next->next;
}
if(flag)
{
remove(key);
}
}
//根据下标删除节点
void remove(int key)
{
if(size<1||key <0||key>size-1)
{
return ;
}
PNODE next =head->next;
PNODE pred=head;
PNODE node=NULL;
for(int i=0;i<size;i++)
{
if(key==i)
{
pred->next=next->next;
}
pred=next;
next=next->next;
}
}
3.根据下标获取值
//根据下标获取值
int get(int key)
{
int avl=0;
PNODE next=head->next;
for(int i=0;i<size;i++)
{
if(i==key)
{
avl=next->data;
break;
}
next=next->next;
}
return avl;
}
4.清空链表和判断是否为空
//清空列表
void clear(){
while(head->next!=NULL)
{
PNODE tmp=head->next;
head->next=tmp->next;
delete(tmp);
}
size=0;
}
//判断是否为空
bool Empty()
{
return size<1;
}
5.打印输出
void show()
{
PNODE next =head->next;
for(int i=0;i<size;i++)
{
cout<<next->data<<" ";
next=next->next;
}
cout<<endl;
}
完整代码
#include<iostream>
using namespace std;
typedef struct Node
{
int data;
struct Node* next;
}Node,*PNODE; //PNODE == struct Node* PNODE
class NodeList
{
protected :
PNODE head;
int size;
public :
NodeList() //构造函数
{
size=0;
head=new Node;
head->next=NULL;
head->data=0;
}
//析构函数 释放内存
~NodeList()
{
while(head->next!=NULL)
{
PNODE tmp=head->next;
head->next=tmp->next;
delete(tmp);
}
size=0;
delete(head);
}
//插入节点
void insert(int data)
{
PNODE tmp =new Node;
tmp->data=data;
tmp->next=NULL;
PNODE last =head;
while(last->next !=NULL)
{
last=last->next;
}
last->next=tmp;
size++;
}
void link_delete(int data)
{
if(size<1)
{
return ;
}
bool flag =false;
int key=0;
PNODE next =head->next;
while(next!=NULL)
{
if(next->data==data)
{
flag =true;
break;
}
key++;
next=next->next;
}
if(flag)
{
remove(key);
}
}
//根据下标删除节点
void remove(int key)
{
if(size<1||key <0||key>size-1)
{
return ;
}
PNODE next =head->next;
PNODE pred=head;
PNODE node=NULL;
for(int i=0;i<size;i++)
{
if(key==i)
{
pred->next=next->next;
}
pred=next;
next=next->next;
}
}
//根据下标获取值
int get(int key)
{
int avl=0;
PNODE next=head->next;
for(int i=0;i<size;i++)
{
if(i==key)
{
avl=next->data;
break;
}
next=next->next;
}
return avl;
}
//在第key个元素之前添加新的节点,成功返回true,下标不存在返回false
bool set(int key,int data)
{
if(key<0||key>size -1)
{
return false;
}
PNODE tmp=new Node;
tmp ->data=data;
tmp->next=NULL;
PNODE pred =head;
PNODE next =head->next;
for(int i=0;i<size;i++)
{
if(key ==i)
{
tmp->next=next;
pred->next=tmp;
}
pred =next;
next=next->next;
}
size++;
return true;
}
//查找元素 如果找到就返回第一个节点下标值,如果没有 就返回-1
int indexof(int data)
{
int key=-1;
PNODE next =head->next;
for(int i=0;i<size;i++)
{
if(next->data==data)
{
key=i;
break;
}
next=next->next;
}
return key;
}
//清空列表
void clear(){
while(head->next!=NULL)
{
PNODE tmp=head->next;
head->next=tmp->next;
delete(tmp);
}
size=0;
}
//判断是否为空
bool Empty()
{
return size<1;
}
void show()
{
PNODE next =head->next;
for(int i=0;i<size;i++)
{
cout<<next->data<<" ";
next=next->next;
}
cout<<endl;
}
};
int main()
{
NodeList linklist;
//插入
linklist.insert(1);
linklist.insert(2);
linklist.insert(3);
linklist.insert(4);
linklist.insert(5);
linklist.insert(6);
//按值查找元素
int a= linklist.indexof(6);
//根据下标查找元素
int b=linklist.get(5);
//删除操作
linklist.link_delete(1);
//按下标删除
linklist.remove(3);
linklist.show();
return 0;
}