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

一、单链表

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语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
ChoSeitaku6 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
Fuxiao___7 小时前
不使用递归的决策树生成算法
算法
我爱工作&工作love我7 小时前
1435:【例题3】曲线 一本通 代替三分
c++·算法
白-胖-子7 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower7 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯7 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
Sunyanhui17 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展
一个不喜欢and不会代码的码农7 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
前端郭德纲8 小时前
浏览器是加载ES6模块的?
javascript·算法