【数据结构】双向链表定义和基本操作

本文介绍了双向链表的基本概念,并详细阐述了包括初始化、创建、判断空表、求长度、取元素、查找元素、插入和删除等关键操作的实现方法。提供了完整的测试代码供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双向链表:

双向链表的定义:

typedef struct DuLNode{
    LElemType data;
    struct DuLNode *next;
    struct DuLNode *pre;
    DuLNode ( LElemType Data=0,struct DuLNode *Pre=NULL,struct DuLNode *Next=NULL){
        data=Data;
        next=Next;
        pre=Pre;
    }
}DuLNode,*DuLinkList;

双向链表基本操作的实现:

(1)、初始化操作  InitDuLinkList( &L )

(2)、建立单链表的操作  CreateDuLinkList(&L , n)

(3)、判断一个线性表是否为空表ListIsEmpty(L)

(4)、求线性表的长度ListLength( L )

(5)、取线性表中的第i个元素GetElem(L,i,&e)

(6)、查找元素e在线性表中的位序LocateElem(L,e)

(7)、插入操作ListInsert(&L,i,e)

(8)、删除操作LIstDelete(&L,i,&e)
 


(1)、初始化操作  InitLinkList( &L )

void InitDuLinkList(DuLinkList &L){
    L=new DuLNode;
}

(2)、建立单链表的操作  CreateLinkList(&L , n)

void CreateLinkList_Tail(DuLinkList &L,int n=0){ //尾插法
    L=new DuLNode;
    DuLinkList Pre=L,p;
    LElemType data;
    for(int i=1;i<=n;i++){
        printf("请输入第%d个data值:\n",i);
        cin>>data;
        p=new DuLNode(data,Pre);
        Pre->next=p;
        Pre=p;
    }
}

 

void CreateLinkList_Head(DuLinkList &L ,int n=0){//头插法
    L=new DuLNode;
    DuLinkList Pre=L,p,s;
    LElemType data;
    for(int i=1;i<=n;i++){
        printf("请输入第%d个data值:\n",i);
        cin>>data;
        p=new DuLNode(data,Pre,Pre->next);
        s=Pre->next;
        if(s)
            s->pre=p;
        Pre->next=p;
    }
}

(3)、判断一个线性表是否为空表ListIsEmpty(L)

int ListIsEmpty(DuLinkList &L){
    if(L->next){
        return 1;
    }return 0;
}

(4)、求线性表的长度ListLength( L )

int ListLength(DuLinkList L){
    int len=0;
    DuLinkList p=L->next;
    while(p){
        len++;
        p=p->next;
    }
    return len;
}

(5)、取线性表中的第i个元素GetElem(L,i,&e)

void GetElem(DuLinkList L,int i,LElemType &e){
    int j=1;
    DuLinkList p=L->next;
    while(p&&j<i){
        j++;
        p=p->next;
    }
    if(j>i||!p){
        printf("");
        return ;
    }
    e=p->data;
}

(6)、查找元素e在线性表中的位序LocateElem(L,e)

LElemType LocateElem(DuLinkList L, LElemType e){
    int j=1;
    DuLinkList p=L->next;
    while(p&&p->data!=e){
        j++;
        p=p->next;
    }
    if(!p){
        printf("LocateElem  not found %d\n",e);
        return -1;
    }
    return j;
}

(7)、插入操作ListInsert(&L,i,e)

void ListInsert(DuLinkList L, int i, LElemType e){
    int j=0;
    DuLinkList p=L,s;
    while(p&&j<i-1){
        j++; p=p->next;
    }
    if(!p||i-1<j||!(p->next)){  //插入位置不能是最后
        printf("ListInsert index %d error\n",i);
        return ;
    }
    s=new DuLNode(e,p,p->next);
    (p->next)->pre=s;
    s->pre=p;
    p->next=s;
}

(8)、删除操作LIstDelete(&L,i,&e)

void ListDelete(DuLinkList &L,int i,LElemType &e){
    int j=0;
    DuLinkList p=L,s;
    while(p->next&&j<i-1){
        j++;
        p=p->next;
    }
    if(!p->next||i<=j){
        printf("\" ListDelete \" index : %d error\n",i);
        return ;
    }
    s=p->next;
    p->next=s->next;
    (s->next)->pre=p;
    e=s->data;
    delete s;
}

 

完整的测试代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define LElemType int
using namespace std;
typedef struct DuLNode{
    LElemType data;
    struct DuLNode *next;
    struct DuLNode *pre;
    DuLNode ( LElemType Data=0,struct DuLNode *Pre=NULL,struct DuLNode *Next=NULL){
        data=Data;
        next=Next;
        pre=Pre;
    }
}DuLNode,*DuLinkList;

void InitDuLinkList(DuLinkList &L){
    L=new DuLNode;
}
void CreateLinkList_Tail(DuLinkList &L,int n=0){ //尾插法
    L=new DuLNode;
    DuLinkList Pre=L,p;
    LElemType data;
    for(int i=1;i<=n;i++){
        printf("请输入第%d个data值:\n",i);
        cin>>data;
        p=new DuLNode(data,Pre);
        Pre->next=p;
        Pre=p;
    }
}
void CreateLinkList_Head(DuLinkList &L ,int n=0){//头插法
    L=new DuLNode;
    DuLinkList Pre=L,p,s;
    LElemType data;
    for(int i=1;i<=n;i++){
        printf("请输入第%d个data值:\n",i);
        cin>>data;
        p=new DuLNode(data,Pre,Pre->next);
        s=Pre->next;
        if(s)
            s->pre=p;
        Pre->next=p;
    }
}
void OutputDuLinkList(DuLinkList &L){
    DuLinkList p=L->next,t;
    printf("按顺序输出\n");
    while(p){
        printf("%d\n",p->data);
        t=p;
        p=p->next;
    }
    printf("按逆序输出\n");
    p=t;
    while(p->pre){
        printf("%d\n",p->data);
        p=p->pre;
    }
}
int ListIsEmpty(DuLinkList &L){
    if(L->next){
        return 1;
    }return 0;
}
int ListLength(DuLinkList L){
    int len=0;
    DuLinkList p=L->next;
    while(p){
        len++;
        p=p->next;
    }
    return len;
}
void GetElem(DuLinkList L,int i,LElemType &e){
    int j=1;
    DuLinkList p=L->next;
    while(p&&j<i){
        j++;
        p=p->next;
    }
    if(j>i||!p){
        printf("");
        return ;
    }
    e=p->data;
}
LElemType LocateElem(DuLinkList L, LElemType e){
    int j=1;
    DuLinkList p=L->next;
    while(p&&p->data!=e){
        j++;
        p=p->next;
    }
    if(!p){
        printf("LocateElem  not found %d\n",e);
        return -1;
    }
    return j;
}
void ListInsert(DuLinkList L, int i, LElemType e){
    int j=0;
    DuLinkList p=L,s;
    while(p&&j<i-1){
        j++; p=p->next;
    }
    if(!p||i<=j){
        printf("ListInsert index %d error\n",i);
        return ;
    }
    s=new DuLNode(e,p,p->next);
    (p->next)->pre=s;
    p->next=s;
}
void ListDelete(DuLinkList &L,int i,LElemType &e){
    int j=0;
    DuLinkList p=L,s;
    while(p->next&&j<i-1){
        j++;
        p=p->next;
    }
    if(!p->next||i<=j){
        printf("\" ListDelete \" index : %d error\n",i);
        return ;
    }
    s=p->next;
    p->next=s->next;
    (s->next)->pre=p;
    e=s->data;
    delete s;
}
int main()
{
    DuLinkList La;
    LElemType e=0,t;
    CreateLinkList_Tail(La,5);
    //CreateLinkList_Head(La,5);
    OutputDuLinkList(La);
    printf("len=%d\n",ListLength(La));
    for(int i=1;i<=5;i++){
        GetElem(La,i,e);
        printf("%d\n",e);
    }

    /*printf("请输入一个需要查找的数: \n");
    scanf("%d",&e);
    t=LocateElem(La,e);
    if(t!=-1){
        printf("Found!!! %d\n",t);
    }*/

    ListInsert(La,2,123);
    OutputDuLinkList(La);

    e=0;
    ListDelete(La,2,e);
    OutputDuLinkList(La);
    if(e!=0){
        printf("删除的元素为: %d \n",e);
    }
    return 0;
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值