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

一、单链表

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;
}
相关推荐
码完就睡1 分钟前
数据结构——循环队列的设计及函数实现(C语言)
数据结构
发发就是发6 分钟前
I2C适配器与算法:从一次诡异的时序问题说起
服务器·驱动开发·单片机·嵌入式硬件·算法·fpga开发
啊哦呃咦唔鱼7 分钟前
leetcode二分查找
数据结构·算法·leetcode
郝学胜-神的一滴20 分钟前
[ 力扣 1124 ] 解锁最长良好时段问题:前缀和+哈希表的优雅解法
java·开发语言·数据结构·python·算法·leetcode·散列表
戴西软件21 分钟前
戴西CAxWorks.VPG车辆工程仿真软件|假人+座椅双调整 汽车仿真效率直接拉满
java·开发语言·人工智能·python·算法·ui·汽车
Tairitsu_H23 分钟前
C++入门指南:从基础语法到核心特性全解析
c++·算法·基础
programhelp_23 分钟前
2026 高盛(Goldman Sachs)Coding Interview 真题分享|Design HashMap + 其他面试题完整解析
算法·哈希算法
Pentane.27 分钟前
力扣HOT100:T.1 两数之和|循环遍历算法笔记及打卡(12/100)
c++·笔记·算法·leetcode
王老师青少年编程29 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:士兵站队
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·士兵战队
无限进步_32 分钟前
二叉树的中序遍历(非递归实现)
开发语言·数据结构·c++·windows·算法·visual studio