线性表的链式存储基本操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    }
}

循环链表

双向链表

2018/1月/2日

猜你喜欢

转载自blog.csdn.net/Yes_butter/article/details/78955973