【数据结构】【单链表算法】链表基本算法

一、单链表

1.准备工作

cpp 复制代码
typedef struct LNode{
    ElemType data;
    struct LNode*next;
}LNode,*LinkList;

2.单链表初始化

cpp 复制代码
Status InitList(LinkList &L){
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    return OK;
}    

3.判断链表是否为空

cpp 复制代码
int ListEmpty(LinkList L){
    if(L->next)
        return 0;
    else 
        return 1;
}
    

4.销毁单链表

cpp 复制代码
Status DestroyList(LinkList &L){
    Lnode*p;
    while(L){
        p=L;
        L=L->next;
        free(p);
    }
    return ok;
}

5.清空链表

cpp 复制代码
Status ClearList(LinkLisk &L){
    LNode*p.*q;
    p=L->next;
    while(p){
        q=p->next;
        free(p);
        p=q;
    }
    L->next=NULL;
    return OK;
}

6.求单链表的长度

cpp 复制代码
int ListLength(LinkList L){
    Lnode*p;
    p=L->next;
    i=0;
    while(p){
        i++;
        p=p->next;
    }
    return i;
}    

7.取值

cpp 复制代码
Status GetElem_L(LinkList L,int i,ElemType &e){
    Lnode*p;
    p=L->next;
    j=1;
    while(p&&j<i){
        p=p->next;
        j++;
    }
    if(!p||j>i) return ERROR;
    e=p->data;
    return OK;
}

8.查找

cpp 复制代码
//返回地址
Lnode*LocateElem(LinkList L,Elemtype e){
    p=L->next;
    while(p&&p->data!=e){
        p=p->next;
    }
    return p;
}
cpp 复制代码
//返回位置序号
int LocateElem(LinkList L,Elemtype e){
    p=L->next;
    j=1;
    while(p&&p->data!=e){
        p=p->next;
        j++;
    }
    if(p) return j;
    else return 0;
}

9.插入

cpp 复制代码
Status ListInsert_L(LinkList &L,int i,ElemType e){
    Lnode*p;
    p=L;
    int j=1;
    while(p&&j<i){
        p=p->next;
        j++;
    }
    if(!p||j>i) return ERROR;
    s=(LinkList)malloc(sizeof(Lnode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return ok;
}

10.删除

cpp 复制代码
Status ListDelete_L(LinkList &L,int i,ElemType &e){
    Lnode*p;
    p=L;
    int j=1;
    while(p->next&&j<i){
        p=p->next;
        j++;
    }
    if(!(p->next)||j>i-1) return ERROR;
    q=p->next;
    p->next=q->next;
    e=q->data;
    free(q);
    return ok;
}
    

11.单链表建立

头插法

cpp 复制代码
void CreateListe_L_1(LinkList &L,int n){
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    for(int i=0;i<n;i++){
        p=(LinkList)malloc(sizeof(LNode));
        scanf(&p->data);
        p->next=L->next;
        L->next=p;
    }
}

尾插法

cpp 复制代码
void  CreateListe_L_2(LinkList &L,int n){
    L=(LinkList)malloc (sizeof(LNode));
    L->next=NULL;
    q=L;
    for(i=1;i<=n;i++){
        p=(LinkList)malloc (sizeof(LNode));
        scanf(&p->data);
        q->next=p; 
        q=p;
    }
    q->next=NULL;
}

二、循环链表

合并Ta,Tb

cpp 复制代码
LinkList Connect(LinkList Ta,LinkList Tb){
    p=Ta->next;
    Ta->next=Tb->next->next;
    delete Tb->next;
    Tb->next=p;
    return Tb;
}

三、双向链表

1.准备工作

cpp 复制代码
typedef struct DuLNode{
    ElemType data;
    struct DuLNode *prior,*next;
}DuLNode,*DuLinkList;

2.插入

cpp 复制代码
Status ListInsett_DuL(DuLinkList &L,int i,ElemType e){
    p=L->next;
    j=1;
    while(p!=L&&j<i){
        p=p->next;
        j++;
    }
    if (p==L || j>i)  return ERROR;
    if (!(s=(DuLinkList)malloc(sizeof(DuLNode)))){
        s->data=e;
        s->prior=p->prior;
        p->prior->next=s;
        s->next=p;
        p->prior=s;
    }
    return OK;
}//ListInsert_Dul

3.删除

cpp 复制代码
 Status ListDelete_L(LinkList &L,int i,ElemType &e){
      p=L;
     j=0;
     while (p->next && j<i-1) {
        p=p->next;
        j++;
    }
    if (!(p->next) || j>i-1)  return ERROR;
   q=p->next;   p->next=q->next;   e=q->data; 
   free(q);
   return OK;
}
相关推荐
艾莉丝努力练剑11 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
偷吃的耗子42 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
dazzle2 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵2 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强2 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
wWYy.2 小时前
数组快排 链表归并
数据结构·链表
张登杰踩2 小时前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao2 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波0072 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc