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

一、单链表

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;
}
相关推荐
数据皮皮侠6 分钟前
1095 《中国城市统计年鉴》面板数据整理
大数据·数据库·人工智能·算法·制造
寒月小酒10 分钟前
3.26 OJ
数据结构·算法
汉克老师17 分钟前
GESP5级C++考试语法知识(十二、递归算法(二))
c++·算法·记忆化搜索·时间复杂度·递归算法·gesp5级·gesp五级
lcreek17 分钟前
计算机网络与图算法:从理论到实践
算法·
sinat_2554878119 分钟前
JSON·学习笔记
java·开发语言·笔记·算法
Yupureki26 分钟前
《算法竞赛从入门到国奖》算法基础:动态规划-基础线性dp
c语言·开发语言·算法·动态规划
Roselind_Yi36 分钟前
从线性回归实战到Python依赖安装踩坑:我的机器学习入门排雷记
笔记·python·算法·机器学习·回归·线性回归·学习方法
宵时待雨1 小时前
C++笔记归纳15:红黑树
开发语言·数据结构·c++·笔记
黑眼圈子1 小时前
牛客刷题记录5
java·开发语言·学习·算法
罗湖老棍子1 小时前
【例 2】A Simple Problem with Integers(信息学奥赛一本通- P1548)
数据结构·算法·线段树·区间修改 区间查询