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

一、单链表

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;
}
相关推荐
清梦202013 分钟前
经典问题---跳跃游戏II(贪心算法)
算法·游戏·贪心算法
Dream_Snowar36 分钟前
速通Python 第四节——函数
开发语言·python·算法
1nullptr1 小时前
三次翻转实现数组元素的旋转
数据结构
Altair澳汰尔1 小时前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
A懿轩A1 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
Python机器学习AI1 小时前
分类模型的预测概率解读:3D概率分布可视化的直观呈现
算法·机器学习·分类
吕小明么2 小时前
OpenAI o3 “震撼” 发布后回归技术本身的审视与进一步思考
人工智能·深度学习·算法·aigc·agi
1 9 J2 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
程序员shen1616112 小时前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法