版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Yes_butter/article/details/78955973
线性表链式存储
由于顺序表的存储特点是用物理上的相邻实现了逻辑上的相邻。它要求用连续的存储单元顺序存储线性表中的各元素。因此,对顺序表插入,删除时需要通过移动数据元素来实现,影响了运行效率。下面来介绍一下线性表的链式存储结构:它不需要用地址连续的存储单元来实现,因为它不需要要求逻辑上相邻的俩个数据元素物理上也相邻,它式通过“链”来表示数据元素的逻辑关系,因此对线性表的插入,删除不需要移动数据元素。
- 1.创建单链表
- 2.求单链表的表长
- 3.查找操作
- 4.插入
- 5.删除操作
typedef int datatype;
//数据结构的定义
typedef struct lnode
{
datatype data;
struct lnode *next;
}LNode,*Link_list;
//1-1.创建单链表,在表头插入,建立线性表的链式存储,这个是带头节点的链表
Link_list Creat_Linklist()
{
Link_list L_list=NULL,s;
datatype data,flag=-1;
cin>>data;//c语言需要根据datatype的类型来确定
while(data!=flag)//实际的flag根据题意来更改
{
s=(Link_list)malloc(sizeof(LNode));
s->data=data;
s->next=L_list;
L_list=s;
cin>>data;
}
return L_list;
}
//1-2.创建单链表,在表尾插入,创建线性表的链式存储,这个也是带头节点的链表
Link_list Creat_Linklist2()
{
Link_list L_list=NULL,s,r=NULL;
datatype data,flag=-1;
cin>>data;
while(data!=flag)
{
s=(Link_list)malloc(sizeof(LNode));
s->data=data;
if(L_list==NULL)L_list=s;
else r->next=s;
r=s;
cin>>data;
}
if(r!=NULL)r->next=NULL;//对于非空表,最后结点的指针域要置空
return L_list;
}
//2.求单链表的表长,默认式带头结点的单链表
int length_Linklist(Link_list L_list)
{
Link_list pt=L_list;
int j=0;
while(pt->next)//不带头结点的判断条件式while(pt)
{
pt=pt->next;
j++;
}
return j;
}
//3-1.查找算法,分成按序号查找,和按值查找。按序号查找,默认也是带头结点的
Link_list Get_Linklist(Link_list L_list,int i)
{
Link_list tmp=L_list;
int j=0;
while(tmp->next!=NULL&&j++<i)
{
tmp=tmp->next;
}
if(j==i)return tmp;
else return NULL;
}
//3-2,按值查找,
Link_list Locate_Linklist(Link_list L_list,datatype x)
{
Link_list tmp=L_list->next;
while(tmp!=NULL&&tmp->data!=x)
{
tmp=tmp->next;
}
return tmp;
}
//4-1.插入结点操作
bool insert_Linklist(Link_list L_list,int position,datatype data)//返回值只是标志。在单链表的第position的位置上插入值为data的元素。
{
Link_list tmp,s;
tmp=Get_Linklist(L_list,position-1);//查找第position-1个结点
if(tmp==NULL)
{
cout<<"位置参数有错误"<<endl;//第position个位置不能插入
return false;
}
else
{
s=(Link_list)malloc(sizeof(LNode));
s->data=data;
s->next=tmp->next;//新结点在第position-1的后面
tmp->next=s;
return true;
}
}
//5 删除运算,删除单链表中第i个数据结点
int Del_linklist(Link_list L_list,int i)
{
Link_list tmp,s;
tmp=Get_Linklist(L_list,i-1);//查找第i-1个结点
if(tmp==NULL)
{
cout<<"第"<<i-1<<"个结点不存在";
return -1;
}
else if(tmp->next==NULL)
{
cout<<"第"<<i<<"个结点不存在";
return 0;
}
else
{
s=tmp->next;
tmp->next=s->next;//从链表中删除
free(s);
return 1;
}
}