其他分享
首页 > 其他分享> > 408数据结构源代码-线性表-链表

408数据结构源代码-线性表-链表

作者:互联网

408数据结构

Linear 线性表

Linklist 链表

一·Single_linked_list.cpp单链表

1.单链表结构体

typedef struct LNode{//单链表结构体
    Elemtype data;
    struct LNode *next;
}LNode,*LinkList;

2.初始化单链表

bool InitList(LinkList &L){//初始化单链表
    L=(LNode *) malloc(sizeof (LNode));
    if(L==NULL)
        return false;
    L->next=NULL;
    return true;
}

3.初始化循环单链表

bool InitList(LinkList &L){//初始化循环单链表
    L=(LNode *) malloc(sizeof (LNode));
    if(L==NULL)
        return false;
    L->next=L;
    return true;
}

4.判断是否为空

bool Empty(LinkList L){//判断是否为空
    if(L->next==NULL)
        return true;
    else
        return false;
}

5.判断循环单链表是否为空

bool Empty(LinkList L){//判断循环单链表是否为空
    if(L->next==L)
        return true;
    else
        return false;
}

6.按位查找

LNode * GetElem(LinkList L,int i){//按位查找
    if(i<0)
        return NULL;
    LNode *p;
    int j=0;
    p=L;
    while (p!=NULL&&j<i){
        p=p->next;
        j++;
    }
    return p;
}

7.后插法

bool InsertNextNode(LNode *p,Elemtype e){//后插法
    if(p==NULL)
        return false;
    LNode *s=(LNode *) malloc(sizeof (LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
}

8.前插法

bool InsertPriorNode(LNode *p,Elemtype e){//前插法
    if(p==NULL)
        return false;
    LNode *s=(LNode *) malloc(sizeof (LNode));
    if(s==NULL)
        return false;
    s->next=p->next;
    p->next=s;
    s->data=p->data;
    p->data=e;
    return true;
}

9.按位插入

bool ListInsert(LinkList &L,int i,Elemtype e){//按位插入
    if(i<1)
        return false;
//    LNode *p;
//    int j=0;
//    p=L;
//    while (p!=NULL&&j<i-1){
//        p=p->next;
//        j++;
//    }
    LNode *p= GetElem(L,i-1);
//    if(p==NULL)
//        return false;
//    LNode *s=(LNode *) malloc(sizeof (LNode));
//    s->data=e;
//    s->next=p->next;
//    p->next=s;
    return InsertNextNode(p,e);
}

10.删除第i位

bool ListDelete(LinkList &L,int i,Elemtype &e){//删除第i位置元素
    if(i<1)
        return false;
//    LNode *p;
//    int j=0;
//    p=L;
//    while (p!=NULL&&j<i-1){
//        p=p->next;
//        j++;
//    }
    LNode *p= GetElem(L,i-1);
    if(p==NULL)
        return false;
    if(p->next==NULL)
        return false;
    LNode *q=p->next;
    e=q->data;
    p->next=q->next;
    free(q);
    return true;
}

11.删除指定节点

bool DeleteNode(LNode *p){//删除指定节点
    if(p==NULL)
        return false;
    LNode *q=p->next;
    p->data=p->next->data;//有小bug,当最后删除最后一个节点时失效。
    p->next=q->next;
    free(q);
    return true;
}

12.按值查找

LNode *LocateElme(LinkList L,Elemtype e){//按值查找
    LNode *p=L->next;
    while (p!=NULL&&p->data!=8)
        p=p->next;
    return p;
}

13.求表长

int Length(LinkList L){//求表长
    int len=0;
    LNode *p=L;
    while(p->next!=NULL){
        p=p->next;
        len++;
    }
    return  len;
}

14.尾插法

LinkList List_TailInsert(LinkList &L){//尾插法
    int x;
    L=(LinkList) malloc(sizeof (LNode));
    LNode *s,*r=L;
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode*) malloc(sizeof (LNode));
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;
    return L;
}

15.头插法

LinkList List_HeadInsert(LinkList &L){//头插法
    LNode *s;
    int x;
    L=(LinkList) malloc(sizeof (LNode));
    L->next=NULL;
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode*) malloc(sizeof (LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}

二.Double_linked_list.cpp双链表

1.双链表结构体

typedef struct DNode{//双链表结构体
    Elemtype data;
    struct DNode *prior,*next;
}DNode,*DLinklist;

2.初始化双链表

bool InitDLinkList(DLinklist &L){//初始化双链表
    L=(DNode *) malloc(sizeof (DNode));
    if(L==NULL)
        return false;
    L->prior=NULL;
    L->next=NULL;
    return true;
}

3.初始化循环双链表

//bool InitDLinkList(DLinklist &L){//初始化循环双链表
//    L=(DNode *) malloc(sizeof (DNode));
//    if(L==NULL)
//        return false;
//    L->prior=L;
//    L->next=L;
//    return true;
//}

4.判断双链表是否为空

bool Empty(DLinklist L){//判断双链表是否为空
    if(L->next==NULL)
        return true;
    else
        return false;
}

5.判断循环双链表是否为空

//bool Empty(DLinklist L){//判断循环双链表是否为空
//    if(L->next==L)
//        return true;
//    else
//        return false;
//}

6.双链表插入

bool InserNextDNode(DNode *p,DNode *s){//双链表插入
    if(p==NULL||s==NULL)
        return false;
    s->next=p->next;
    if(p->next != NULL)
        p->next->prior=s;
    s->prior=p;
    p->next=s;
    return true;
}

7.删除p节点的后继节点

bool DeleteNextDNode(DNode *p){//删除p节点的后继节点
    if(p==NULL)
        return false;
    DNode *q=p->next;
    if(q==NULL)
        return false;
    p->next=q->next;
    if(q->next!=NULL)
        q->next->prior=p;
    free(q);
    return true;
}

8.销毁双链表

void DestoryList(DLinklist &L){//销毁双链表
    while (L->next!=NULL)
        DeleteNextDNode(L);
    free(L);
    L=NULL;
}

三.Static_linked_list.cpp静态链表

1.定义静态链表结构体

#define MaxSize 10//静态链表最大长度
typedef struct {
    Elemtype data;
    int next;
}SLinkList[MaxSize];

代码是使用CLion编写,有需要可以跳转github获取

标签:LinkList,NULL,return,LNode,next,链表,false,源代码,线性表
来源: https://www.cnblogs.com/3456939606zwp/p/16293629.html