数据结构学习之双链表基本操作

数据结构学习之双链表基本操作

0x1 前言

今天实验课,学习了下双链表的写法,这里记录下。

0x2 正文

题目要求如下:
本实验的双链链表元素的类型为char,完成如下实验要求:

(1)初始化单链表h

(2)采用尾插法依次插入a、b、c、d、e

(3)输出单链表h

(4)输出单链表h的长度

(5)判断单链表h是否为空

(6)输出单链表h的第3个元素

(7)输出元素a的逻辑位置

(8)在第4个元素位置上插入元素f

(9)输出单链表h

(10)删除单链表h的第3个元素

(11)输出单链表h

(12)释放单链表h

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

typedef char Elemtype;

typedef struct DNode
{
    Elemtype data; //存放元素值
    struct DNode * prior; //指向前驱结点
    struct DNode * next; //指向后继结点
}DLinkNode;

// 初始化双链表
void InitList(DLinkNode *&h)
{
    h=(DLinkNode *)malloc(sizeof(DLinkNode));
    h->prior=h->next=NULL; //前后指针域置为空
}

// 尾插法插入
void InsertListR(DLinkNode *&h,Elemtype a[],int n)
{
    DLinkNode *s,*r;
    r=h;
    for(int i=0;i<n;i++)
    {
        s=(DLinkNode *)malloc(sizeof(DLinkNode));
        s->data=a[i];
        r->next=s;
        s->prior=r;
        r=s;
    }
    r->next=NULL;
}

//输出双链表
void DispList(DLinkNode *h)
{
    DLinkNode *p;
    p=h->next;
    while(p!=NULL)
    {
        printf("%c ",p->data);
        p=p->next;
    }
    printf("\n");
}

//输出双链表h的长度
int ListLength(DLinkNode *h)
{
    int n=0;
    DLinkNode *p=h->next;
    while(p!=NULL)
    {
        n++;
        p=p->next;
    }
    return(n);
}

//判断线性表是否为空表
bool ListEmpty(DLinkNode *h)
{
    return(h->next==NULL);
}

//输出指定下标的元素
char LocateElemByIndex(DLinkNode *h,int i)
{
    DLinkNode *p=h;
    while(p->next!=NULL&&i)
    {
        i--;
        p=p->next;
    }
    if(p->next==NULL)
    {
        return(false);
    }
    else
        return(p->data);
}

// 输出指定元素的位置
int LocateElem(DLinkNode *h,Elemtype e)
{
    int n=1;
    DLinkNode *p=h->next;
    while(p!=NULL&&p->data!=e)
    {
        n++;
        p=p->next;
    }
    if(p==NULL)
    {
        return(0);
    }else
        return(n);
}

//在指定位置插入指定的元素
bool ListInsert(DLinkNode *&h,int i,Elemtype e)
{
    DLinkNode *p=h,*s;
    int j=0;
    if(i<=0) return(false);
    while(j<i-1&&p!=NULL)
    {
        j++;
        p=p->next;
    }
    if(p==NULL)
    {
        return false;
    }
    s=(DLinkNode *)malloc(sizeof(DLinkNode));
    s->data=e;
    s->prior=p;
    s->next=p->next;
    if(p->next!=NULL)
        p->next->prior=s;
    p->next=s;
    return(true);
}

//删除指定下标元素
bool ListDelete(DLinkNode *&h,int i,Elemtype &e)
{
    DLinkNode *p=h,*q;
    int j=0;
    if(i<=0) return(false);
    while(j<i-1&&p!=NULL)
    {
        j++;
        p=p->next;
    }
    if(p==NULL)
    {
        return(false);
    }else
    {
        q=p->next;
        if(q==NULL)
            return(false);
        e=q->data;
        p->next=q->next;
        if(p->next!=NULL)
            q->prior=p;
        free(q);
        return(true);
    }
}

//释放循环链表
void DestroyList(DLinkNode *&h)
{
    DLinkNode *pre=h,*p=h->next;
    while(p!=NULL)
    {
        free(pre);
        pre=p;
        p=p->next;
    }
    free(pre);
    cout<< "List has been destroyed!" <<endl;
}
int main()
{
    DLinkNode *h;
    char e;
    InitList(h);
    char a[5]={'a','b','c','d','e'};
    InsertListR(h,a,5);
    DispList(h);
    cout<< ListLength(h) <<endl;
    if(ListEmpty(h))
    {
        cout<< "List is Empty!"<<endl;
    }else
    {
        cout<<"List isn't Empty!"<<endl;
    };
    cout<< LocateElemByIndex(h,3)<<endl;
    cout<< LocateElem(h,'a')<<endl;
    ListInsert(h,4,'f');
    DispList(h);
    ListDelete(h,3,e);
    DispList(h);
    DestroyList(h);
    return 0;
}

运行结果如下图:

0x3 总结

感觉和单链表不是很大区别,主要是在插入或者删除的时候注意处理下前继指针,比如判断后继是否存在,然后修改后继的前继指针。

原文地址:https://www.cnblogs.com/xq17dog/p/10612070.html

时间: 2024-08-08 13:47:39

数据结构学习之双链表基本操作的相关文章

数据结构学习之单链表基本操作

数据结构学习之单链表基本操作 0x1 前言 今天实验课,学习了下单链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的单链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)释

文章分享:简单数据结构学习:单向链表

文章分享:简单数据结构学习:单向链表:https://www.textarea.com/aprikyb/jiandan-shujujiegou-xuexi-danxiang-lianbiao-252/

C++ 双链表基本操作

上一篇博客主要总结了单向链表,这次再总结一下双向链表. 1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 结构图如下所示: 2.基本操作实例 DoubleList.cpp #include "stdafx.h" #include "DoubleList.h" #include <stdio.h>

实例讲解C++ 双链表基本操作

1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 结构图如下所示: 2.基本操作实例 DoubleList.cpp #include "stdafx.h" #include "DoubleList.h" #include <stdio.h> #include <malloc.h>

数据结构实践——循环双链表应用

本文针对数据结构基础系列网络课程(2):线性表的实践项目. [项目- 循环双链表应用] 设非空线性表ha和hb都用带头节点的循环双链表表示.设计一个算法Insert(ha,hb,i).其功能是:i=0时,将线性表hb插入到线性表ha的最前面:当i>0时,将线性表hb插入到线性表ha中第i个节点的后面:当i大于等于线性表ha的长度时,将线性表hb插入到线性表ha的最后面. 请在实现算法时,除项目中给出的特殊要求,其余工作均可利用项目4完成的算法支持. [参考解答](循环双链表的基本运算算法,请参考

[C++11][数据结构]自己的双链表实现

这个双链表,是我模仿stl的list制作的,只实现了一些基本功能,像merge,transfer这些就没有实现,用户可以用基本操作来自己做外部实现. 我没有选用stl的[begin,end)迭代器模式,而是使用传统的[head,tail].不过,为了配合stl算法,我还是加了两个begin(),end()方法,模拟了一下stl容器.模拟的还算及格,至少我可以做类似for (; begin != end; ++begin)这样的事,也可以让我的容器搭配一些stl算法,这在之后的demo里可以看到.

【c++版数据结构】之双链表的实现(带头结点以及尾节点)

所实现的双链表的结构如下图所示: 双链表的实现,和第一篇文章单链表的实现大致相同点击打开链接 本篇文章在构建节点的同时,初始化构建节点的前驱和后继,具体细节参考下列代码 头文件:DList.h #ifndef DLIST_H_ #define DLIST_H_ typedef enum{FALSE,TRUE}Status; #include<iostream> #include<cassert> using namespace std; template<class Type

c++学习笔记—单链表基本操作的实现

用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: [cpp] view plaincopy #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct Lnode { int data; struct 

双链表基本操作

#include <stdlib.h> #include <iostream> using namespace std; #define null 0 #define MAXSIZE 50 struct strlnode { int data; struct strlnode *plast; struct strlnode *pnext; }; void create(struct strlnode **p, int x) /*创建双链表(表头节点)*/ { struct strl